协议内部如何实施?

时间:2012-01-09 11:15:47

标签: objective-c

据我所知,Objective-C中的类是按C结构存储的。 如何实施协议?

我想简单地理解这一点。

[NSObject conformsToProtocol:]做什么来检查一个类是否符合协议?

是否存在协议的表或数据结构,告知协议中有哪些选择器?

注意:此处的术语“协议”用于指代Objective C构造而非网络协议。

2 个答案:

答案 0 :(得分:3)

如果您查看Objective-C Runtime Reference,您会发现有几个功能可让您检索&检查所谓的Protocol结构的内容。

这些结构允许访问Protocol对象包含的内容,其属性名称应该推断它们的基本目的是什么。

Protocol包含的部分成员如下:

  1. objc_method_description结构列表。
  2. objc_property_t结构列表。
  3. 当然还有一个名为protocol_getName的方法,它将为您提供协议本身的名称。

    我认为这应该足以推断出Objective-C编译器+运行时如何实现这些协议。

    我对它们实际实现方式的想法是编译器在编译时将这些所谓的@protocol声明转换为C结构,而conformsToProtocol:之类的Objective-C方法只是执行对由@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));
    

答案 1 :(得分:0)

协议通过指定调用某个方法来工作。您询问对象'respondsToSelector',检查它是否实现了特定方法,然后通过调用该方法调用它。