Tiempo de ejecución de Objective-C: ¿la mejor manera de verificar si la clase se ajusta al protocolo?

172

Tengo una clase (pero ninguna instancia) y necesito saber si se ajusta a un determinado protocolo. Sin embargo, Class se puede subclasificar varias veces y class_conformsToProtocol () ignora los protocolos declarados en las superclases.

Podría usar class_getSuperclass () y verificar recursivamente todas las clases en la jerarquía hacia arriba hasta que la superclase sea nula. Sin embargo, me pregunto si eso podría ser ineficiente para las jerarquías de clase profundamente anidadas, y ¿tal vez hay una mejor manera de hacerlo?

En otras palabras, ¿cómo se implementa mejor el método NSObject conformsToProtocol utilizando métodos de tiempo de ejecución Objective-C para que encuentre protocolos en superclases?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Si estoy en el camino correcto con el ascenso recursivo de la jerarquía de clases, házmelo saber.

LearnCocos2D
fuente

Respuestas:

309

Según los documentos ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

Deberia trabajar.

Wevah
fuente
44
Tienes razón. Era tarde y Xcode no hizo sugerencias para completar el código. Verifiqué la definición de Clase y al ver que era "typedef struct objc_class * Class", no verifiqué la referencia de clase NSObject.
LearnCocos2D
¿Hay alguna manera de hacerlo en una instancia en lugar de una clase? Mi self.delegateimplementa múltiples protocolos y quiero verificar si se ajusta a otros que no sean de su clase.
Konrad Piascik
@KonradPiascik a llamarlo en la instancia en su lugar: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah
3

O, en caso de que sea un puntero general, como:

Class<MyProtocol> someClassPointer = nil;

puedes usar:

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