2010-08-08 9 views
159

Ich habe eine Klasse (aber keine Instanz) und muss wissen, ob sie einem bestimmten Protokoll entspricht. Die Klasse kann jedoch mehrfach unterklassifiziert werden, und class_conformsToProtocol() ignoriert Protokolle, die für Superklassen deklariert sind.Objective-C Runtime: Der beste Weg, um zu überprüfen, ob die Klasse dem Protokoll entspricht?

Ich könnte einfach class_getSuperclass() und rekursiv überprüfen alle Klassen in der Hierarchie nach oben, bis die Oberklasse ist Null. Aber ich frage mich, ob das für tief verschachtelte Klassenhierarchien ineffizient sein könnte, und vielleicht gibt es eine bessere Möglichkeit, das zu tun?

Mit anderen Worten, wie ist die NSObject-Methode conformsToProtocol am besten mit Objective-C-Laufzeitmethoden implementiert, so dass es Protokolle über Superklassen findet?

[myObject conformsToProtocol:@protocol(MyProtocol)]; 

Wenn ich auf dem richtigen Weg bin mit rekursiv die Klassenhierarchie hinauf gehen lass es mich wissen.

Antwort

283

According to the docs,

[MyClass conformsToProtocol:@protocol(MyProtocol)]; 

sollte funktionieren.

+4

Du hast Recht:

Class<MyProtocol> someClassPointer = nil; 

Sie verwenden können. Es war spät und es gab keine Codevervollständigungsvorschläge von Xcode. Ich überprüfte die Definition der Klasse und sah, dass es "typedef struct objc_class * Class" war. Ich habe die NSObject Klassenreferenz nicht überprüft. – LearnCocos2D

1

Oder, falls es ein allgemeiner Zeiger ist, wie:

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