Objective-C运行时:检查类是否符合协议的最佳方法?


171

我有一个Class(但没有实例),需要知道它是否符合某个协议。但是,类可以被子类化多次,并且class_conformsToProtocol()会忽略在超类上声明的协议。

我可以只使用class_getSuperclass()并递归地检查层次结构中的所有类,直到超类为nil。但是,我想知道这对于深度嵌套的类层次结构是否效率不高,也许有更好的方法可以做到这一点?

换句话说,如何使用Objective-C运行时方法最好地实现NSObject方法conformsToProtocol,以便它可以找到超类上的协议?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

如果我在正确的方向上递归地进行类层次结构研究,请告诉我。

Answers:


309

根据文档

[MyClass conformsToProtocol:@protocol(MyProtocol)];

应该管用。


4
你是对的。太晚了,Xcode没有提出代码完成建议。我检查了Class的定义,发现它是“ typedef struct objc_class * Class”,我没有检查NSObject类的引用。
LearnCocos2D 2010年

有什么办法可以在实例上而不是在类上吗?我self.delegate实现了多种协议,我想检查它是否与其他协议一致。
康拉德·皮亚西克

@KonradPiascik只需在实例上调用它即可:[someObject conformsToProtocol:@protocol(MyProtocol)]
Wevah,

3

或者,如果它是通用指针,例如:

Class<MyProtocol> someClassPointer = nil;

您可以使用:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.