Objective-C Runtime: le meilleur moyen de vérifier si la classe est conforme au protocole?

172

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ée plusieurs fois et class_conformsToProtocol () ignore les protocoles déclarés sur les superclasses.

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 conformsToProtocol est-elle mieux implémentée à l'aide des méthodes d'exécution Objective-C afin de trouver des protocoles sur des superclasses?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Si je suis sur la bonne voie avec une montée récursive dans la hiérarchie des classes, faites-le moi savoir.

ApprendreCocos2D
la source

Réponses:

309

Selon la documentation ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

devrait marcher.

Wevah
la source
4
Vous avez raison. Il était tard et aucune suggestion de complétion 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 classe NSObject.
LearnCocos2D
Existe-t-il un moyen de le faire sur une instance au lieu d'une classe? My self.delegateimplémente plusieurs protocoles et je veux vérifier s'il est conforme à d'autres que sa classe.
Konrad Piascik
@KonradPiascik il suffit d' appeler sur l'instance à la place: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah le
3

Ou, dans le cas où il s'agit d'un pointeur général, comme:

Class<MyProtocol> someClassPointer = nil;

vous pouvez utiliser:

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