据我所知,Objective-C中的类是以C结构的形式存储的。 协议是如何实现的?协议在内部如何实现?
我想用简单的语言理解这一点。
[NSObject conformsToProtocol:]
做什么来检查一个类是否符合协议?
是否有一个协议的表或数据结构,告诉协议中有哪些选择器?
注意:此处的术语“协议”用于指代Objective C构造而非网络协议。
据我所知,Objective-C中的类是以C结构的形式存储的。 协议是如何实现的?协议在内部如何实现?
我想用简单的语言理解这一点。
[NSObject conformsToProtocol:]
做什么来检查一个类是否符合协议?
是否有一个协议的表或数据结构,告诉协议中有哪些选择器?
注意:此处的术语“协议”用于指代Objective C构造而非网络协议。
如果你看看Objective-C Runtime Reference,你会发现有几个函数可以让你检索结构的内容。
这些结构允许访问对象包含的内容,其属性名称应该可以推断出它们的基本目的是什么。
一些,一个Protocol
包含成员如下:
objc_method_description
结构列表。objc_property_t
结构列表。当然还有一种叫做protocol_getName
的方法,它会给你协议本身的名字。
我认为这应该足以推断这些协议是如何由Objective-C编译器+运行时实现的。
我对他们是如何实际实施的想法是,编译器开启这些所谓@protocol
声明到在编译时,C的结构,和Objective-C的方法,如conformsToProtocol:
只需在传递的成员进行比较-in结构,由@protocol
语言结构生成。
因此,你可以做这样的事情:
@protocol BlahProtocol <NSObject>
-(void)blahMethod;
@property (nonatomic, strong) id blahProperty;
@end
//...
Protocol *blah = objc_getProtocol("BlahProtocol");
struct objc_method_description blahMethodDescription = protocol_getMethodDescription(blah, @selector(blahMethod), NO, YES);
NSLog(@"%s %s", blahMethodDescription.name, blahMethodDescription.types);
objc_property_t blahProperty = protocol_getProperty(blah, "blahProperty", NO, YES);
NSLog(@"%s", property_getAttributes(blahProperty));
协议通过指定某个方法被调用来工作。您询问对象'respondsToSelector',检查它是否实现了特定方法,然后通过调用方法调用它。
'conformsToProtocol:'不关心什么是在该协议。它只是检查协议是否在类或其任何超类的协议列表中(根据'class_copyProtocolList()') – user102008 2012-07-18 20:54:20