【问题标题】:Objective-C Runtime: best way to check if class conforms to protocol?Objective-C 运行时:检查类是否符合协议的最佳方法?
【发布时间】:2011-03-27 01:28:39
【问题描述】:

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

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

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

 [myObject conformsToProtocol:@protocol(MyProtocol)];

如果我在递归向上类层次结构的正确轨道上,请告诉我。

【问题讨论】:

    标签: objective-c runtime


    【解决方案1】:

    According to the docs,

    [MyClass conformsToProtocol:@protocol(MyProtocol)];
    

    应该可以。

    【讨论】:

    • 你是对的。很晚了,Xcode 没有提出代码完成建议。我检查了 Class 的定义,发现它是“typedef struct objc_class *Class” 我没有检查 NSObject 类引用。
    • 有没有办法在实例而不是类上做到这一点?我的self.delegate 实现了多种协议,我想检查它是否符合其他协议而不是它的类。
    • @KonradPiascik 只需在实例上调用它:[someObject conformsToProtocol:@protocol(MyProtocol)]
    【解决方案2】:

    或者,如果它是一个通用指针,比如:

    Class<MyProtocol> someClassPointer = nil;
    

    你可以使用:

    [someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多