Runtime Objective-C: il modo migliore per verificare se la classe è conforme al protocollo?


172

Ho una classe (ma nessuna istanza) e ho bisogno di sapere se è conforme a un determinato protocollo. Tuttavia, Class può essere sottoclassato più volte e class_conformsToProtocol () ignora i protocolli dichiarati nelle superclassi.

Potrei semplicemente usare class_getSuperclass () e controllare ricorsivamente tutte le classi nella gerarchia verso l'alto fino a quando la superclasse è nulla. Tuttavia mi chiedo se ciò potrebbe essere inefficiente per le gerarchie di classi profondamente annidate, e forse c'è un modo migliore per farlo?

In altre parole, in che modo il metodo NSObject è conforme al protocollo meglio implementato usando i metodi di runtime Objective-C in modo che trovi i protocolli sulle superclassi?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Se sono sulla buona strada per salire ricorsivamente alla gerarchia di classi, fammelo sapere.

Risposte:


309

Secondo i documenti ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

dovrebbe funzionare.


4
Hai ragione. Era tardi e Xcode non ha avanzato suggerimenti sul completamento del codice. Ho verificato la definizione di Class e vedendo che si trattava di "typedef struct objc_class * Class" non ho verificato il riferimento di classe NSObject.
LearnCocos2D

Esiste un modo per farlo su un'istanza anziché su una classe? Il mio self.delegateimplementa più protocolli e voglio verificare se è conforme ad altri rispetto alla sua classe.
Konrad Piascik,

@KonradPiascik Basta chiamare nell'istanza invece: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah,

3

O, nel caso sia un puntatore generale, come:

Class<MyProtocol> someClassPointer = nil;

Puoi usare:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.