存在-[NSObject conformsToProtocol:]
方法来检查是否采用了特定的协议。是否有任何方法可以获得类所采用的所有协议,而不是检查列表?
有一个更优雅的解决方案: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);
正好有NSObject +conformsToProtocol
;协议一致性被声明为@interface
的一部分,因此它并不特定于每个实例。所以如。
if( [[self class] conformsToProtocol:@protocol(UIScrollViewDelegate)])
NSLog(@"I claim to conform to UIScrollViewDelegate");
根本不需要下拉到c级运行时方法,至少对于你的问题的第一部分是这样。NSObject
中没有提供支持协议的列表
你可以试试objc_copyProtocolList
。你得到所有协议的列表,然后通过迭代列表来检查当前对象是否符合特定的协议。
编辑:H2CO3溶液真的比较好