是否有任何内省方法可以在Objective-C中获取所有采用的类协议?

Sha*_*lla 8 introspection objective-c objective-c-runtime objective-c-protocol

有一种-[NSObject conformsToProtocol:]方法可以检查是否采用了特定的协议.是否有任何方法可以获取类的所有采用的协议,而不是检查列表?

小智 12

有一个更优雅的解决方案:直接返回所采用的类协议.用法:class_copyProtocolList()

Class cls = [self class]; // or [NSArray class], etc.
unsigned count;
Protocol **pl = class_copyProtocolList(cls, &count);

for (unsigned i = 0; i < count; i++) {
    NSLog(@"Class %@ implements protocol <%s>", cls, protocol_getName(pl[i]));
}

free(pl);
Run Code Online (Sandbox Code Playgroud)

  • 一个人应该记住,这个列表不包含超类所采用的协议,因此 - 根据这个列表的用途 - 可能需要走上超类链并再次调用class_copyProtocolList(). (3认同)