2010-08-08 4 views
159

J'ai une classe (mais pas d'instance) et j'ai besoin de savoir si elle est conforme à un certain protocole. Cependant, Class peut être sous-classé plusieurs fois et class_conformsToProtocol() ignore les protocoles déclarés sur les superclasses.Objective-C Runtime: meilleur moyen de vérifier si la classe est conforme au protocole?

Je pourrais simplement utiliser class_getSuperclass() et vérifier récursivement toutes les classes de la hiérarchie jusqu'à ce que la superclasse soit nulle. Cependant, je me demande si cela pourrait être inefficace pour les hiérarchies de classes profondément imbriquées, et peut-être y a-t-il une meilleure façon de le faire? En d'autres termes, comment la méthode NSObject est-elle la plus conforme à ToProtocol en utilisant les méthodes d'exécution Objective-C pour trouver des protocoles sur les superclasses?

[myObject conformsToProtocol:@protocol(MyProtocol)]; 

Si je suis sur la bonne voie avec récursive en remontant la hiérarchie des classes juste faites-moi savoir.

Répondre

283

According to the docs,

[MyClass conformsToProtocol:@protocol(MyProtocol)]; 

devrait fonctionner.

+4

Vous avez raison. Il était tard et aucune suggestion d'achèvement de code n'a été faite par Xcode. J'ai vérifié la définition de Class et vu qu'il s'agissait de "typedef struct objc_class * Class", je n'ai pas vérifié la référence de la classe NSObject. – LearnCocos2D

1

Ou, dans le cas où il est un pointeur général, comme:

Class<MyProtocol> someClassPointer = nil; 

vous pouvez utiliser:

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