8

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

4

3 回答 3

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);
于 2013-06-12T19:30:42.757 回答
3

确实有NSObject +conformsToProtocol;协议一致性被声明为的一部分,@interface因此它并不特定于每个实例。所以例如

if( [[self class] conformsToProtocol:@protocol(UIScrollViewDelegate)])
    NSLog(@"I claim to conform to UIScrollViewDelegate");

根本不需要下降到 C 级运行时方法,至少对于您问题的第一部分。NSObject获取支持的协议列表没有任何意义。

于 2013-06-12T20:42:32.820 回答
2

你可以试试objc_copyProtocolList

即你得到所有协议的列表,然后通过迭代列表检查当前对象是否符合特定协议。

编辑:

H2CO3溶液确实更好

于 2013-06-12T16:53:46.750 回答