Objective-C Runtime: melhor maneira de verificar se a classe está em conformidade com o protocolo?

171

Eu tenho uma classe (mas nenhuma instância) e preciso saber se está em conformidade com um determinado protocolo. No entanto, Class pode ser subclassificado várias vezes e class_conformsToProtocol () ignora os protocolos declarados nas superclasses.

Eu poderia apenas usar class_getSuperclass () e verificar recursivamente todas as classes na hierarquia para cima até que a superclasse seja nula. No entanto, eu me pergunto se isso pode ser ineficiente para hierarquias de classe profundamente aninhadas, e talvez haja uma maneira melhor de fazer isso?

Em outras palavras, como o método NSObject é melhor implementado usando o método de tempo de execução Objective-C para que ele encontre protocolos nas superclasses?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Se eu estiver no caminho certo, subindo recursivamente a hierarquia de classes, é só me avisar.

LearnCocos2D
fonte

Respostas:

309

De acordo com os documentos ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

Deveria trabalhar.

Wevah
fonte
4
Você está certo. Era tarde e nenhuma sugestão de conclusão de código foi feita pelo Xcode. Eu verifiquei a definição de Class e, vendo que era "typedef struct objc_class * Class", não verifiquei a referência da classe NSObject.
LearnCocos2D
Existe alguma maneira de fazer isso em uma instância em vez de em uma classe? Meu self.delegateimplementa vários protocolos e quero verificar se está em conformidade com outras pessoas além da classe.
Konrad Piascik
@KonradPiascik basta chamá-lo na instância em vez disso: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah
3

Ou, caso seja um ponteiro geral, como:

Class<MyProtocol> someClassPointer = nil;

você pode usar:

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