Objective-C-Laufzeit: Der beste Weg, um zu überprüfen, ob die Klasse dem Protokoll entspricht?

171

Ich habe eine Klasse (aber keine Instanz) und muss wissen, ob sie einem bestimmten Protokoll entspricht. Class kann jedoch mehrmals in Unterklassen unterteilt werden, und class_conformsToProtocol () ignoriert Protokolle, die für Superklassen deklariert wurden.

Ich könnte einfach class_getSuperclass () verwenden und rekursiv alle Klassen in der Hierarchie nach oben überprüfen, bis die Superklasse Null ist. Ich frage mich jedoch, ob dies für tief verschachtelte Klassenhierarchien ineffizient sein könnte, und vielleicht gibt es einen schöneren Weg, dies zu tun?

Mit anderen Worten, wie lässt sich die NSObject-Methode am besten mit Objective-C-Laufzeitmethoden implementieren, um Protokolle für Oberklassen zu finden?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Wenn ich mit der rekursiven Erhöhung der Klassenhierarchie auf dem richtigen Weg bin, lassen Sie es mich einfach wissen.

LearnCocos2D
quelle

Antworten:

309

Laut den Dokumenten ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

sollte arbeiten.

Wevah
quelle
4
Du hast recht. Es war spät und Xcode machte keine Vorschläge zur Vervollständigung des Codes. Ich habe die Definition von Class überprüft und festgestellt, dass es sich um "typedef struct objc_class * Class" handelt. Ich habe die NSObject-Klassenreferenz nicht überprüft.
LearnCocos2D
Gibt es eine Möglichkeit, dies auf einer Instanz anstelle einer Klasse zu tun? Mein self.delegateimplementiert mehrere Protokolle und ich möchte überprüfen, ob es mit anderen als seiner Klasse übereinstimmt.
Konrad Piascik
@KonradPiascik Rufen Sie es stattdessen einfach auf der Instanz auf : [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah
3

Oder, falls es sich um einen allgemeinen Zeiger handelt, wie:

Class<MyProtocol> someClassPointer = nil;

Sie können verwenden:

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