2011-08-03 45 views
20

在Objective-C的ObjC参数,有可能通过一个类作为参数的方法:声明,这是一个类符合的协议

- (void) methodThatTakesClass:(Class)theClass; 

而且它能够传递一个实例,它是符合协议作为参数:

- (void) myConformInstance:(id <MyProtocol>)theObject; 

是否可以使用组合功能?采用符合特定协议的类的方法。

回答

12

是的。以下是将记录NSObject类的有效程序。如果你试图通过不符合NSObject的,如Object类的类

#import <Foundation/Foundation.h> 
void f(Class <NSObject> c) { 
    NSLog(@"%@",c); 
} 
int main() { 
    f([NSObject class]); 
} 

这将导致一个编译器错误。您也可以将其用于方法。

- (void)printClass:(Class <NSObject>)c; 
+2

从[协议](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html) :“协议不能用于输入类对象,只有实例可以被静态类型化为一个协议,就像只有实例可以静态类型到一个类一样(但是,在运行时,类和实例都会响应conformsToProtocol:消息。)“ – albertamg

+0

@albertamg好找。但是,至少有一些编译器会通过它。该规则可能是因为您无法更改代表该类的对象以符合协议。 – ughoavgfhw

-2

也有效:

@interface Something: Object { 
} 
- (void) foo:(int(*)(void))bar; 
@end 

@implementation Something 
- (void) foo:(int(*)(void))bar { 
    return (*bar)(); 
} 
@end 

int someFunc(void) { 
    return 9; 
} 

int main (int argc, char **argv) { 
    Something *object = [[Something alloc] init]; 

    printf("%i\n", [object foo:&someFunc]); 

    [object release]; 

    return 0; 
} 
+0

这似乎是一个完全不同的问题的答案。 –