Esiste un metodo -[NSObject conformsToProtocol:]
per verificare se un protocollo specifico è adottato o meno. C'è qualche metodo per ottenere tutti i protocolli adottati per una classe, piuttosto che controllare una lista?Esiste un metodo di introspezione per ottenere tutti i protocolli adottati per una classe in Objective-C?
risposta
C'è una soluzione più elegante: class_copyProtocolList()
direttamente restituisce i protocolli adottati di una classe. Utilizzo:
Class cls = [self class]; // or [NSArray class], etc.
unsigned count;
Protocol **pl = class_copyProtocolList(cls, &count);
for (unsigned i = 0; i < count; i++) {
NSLog(@"Class %@ implements protocol <%s>", cls, protocol_getName(pl[i]));
}
free(pl);
Si deve solo tenere a mente che questo elenco non contiene i protocolli adottati dalle superclassi, quindi - a seconda dell'elenco usato per questo elenco - potrebbe essere necessario risalire la catena della superclasse e chiamare di nuovo class_copyProtocolList(). –
@MartinR Esattamente, esattamente, stavo davvero facendo fatica a capire perché questo non elencava un protocollo per "NSMutableDictionary" ... –
è un'ottima risposta. Ha funzionato bene. Potrebbe non funzionare con ARC. ma funzionerà sicuramente con non ARC. Grazie. –
Si può provare objc_copyProtocolList
Vale a dire si ottiene l'elenco di tutti i protocolli e quindi si controlla se l'oggetto corrente è conforme a un protocollo specifico iterando l'elenco.
Edit:
H2CO3 soluzione è davvero meglio un
Oppure 'class_copyProtocolList()'. –
Come usarlo praticamente? –
Vuoi dire che dovrei scrivere il codice? – Max
C'è esattamente NSObject +conformsToProtocol
; la conformità del protocollo è dichiarata come parte dello @interface
quindi non è specifica per ciascuna istanza. Quindi ad es.
if([[self class] conformsToProtocol:@protocol(UIScrollViewDelegate)])
NSLog(@"I claim to conform to UIScrollViewDelegate");
Non c'è bisogno di discesa ai metodi di esecuzione di livello C a tutti, almeno per la prima parte della tua domanda. Non c'è niente in NSObject
per ottenere un elenco di protocolli supportati.
- 1. Introspezione di classe in Common Lisp
- 2. Esiste un metodo init per la classe di azione struts2?
- 3. Metodo preferito per dichiarare i metodi in una classe
- 4. Esiste un metodo per disattivare i gesti per Windows8
- 5. Esiste un metodo .NET integrato per ottenere tutte le proprietà e i valori per un oggetto?
- 6. Ottenere un elenco di tutti i classloader in una JVM
- 7. Java8: esiste un modo per ottenere un riferimento al metodo di istanza da un riferimento al metodo di classe?
- 8. Esiste comunque un modo per ottenere tutti i nomi dei file senza eccezioni in C#?
- 9. Scoprire se esiste un metodo in una classe statica
- 10. Utilizzo di protocolli C oggettivi
- 11. Eseguire un metodo prima di tutti i metodi di una classe
- 12. stoccaggio estensione Swift per i protocolli
- 13. Oracle: esiste un modo per ottenere i tipi di dati di colonna per una vista?
- 14. "Classe" non contiene una definizione per "Metodo"
- 15. Come scrivere un metodo di descrizione appropriato per una classe?
- 16. Esiste un modo per recuperare tutti i record in una query NEST (ElasticSearch)?
- 17. Elenca tutti i metodi di una data classe, esclusi i metodi della classe genitrice in PHP
- 18. C'è un modo per ottenere il bytecode per una classe in fase di esecuzione?
- 19. Come ottenere tutti i dettagli di un contatto in Android
- 20. Esiste una classe standard per rappresentare un "intervallo" in .net?
- 21. sovrascrive un metodo per un'istanza di una classe?
- 22. Esiste una scorciatoia per sovrascrivere i metodi in una classe Android Framework in Eclipse?
- 23. Esiste una classe IndexSet e una classe Range per Java?
- 24. HBase ottenere tutti i valori timestamp per una cella
- 25. Python: fai qualcosa per qualsiasi metodo di una classe?
- 26. Esiste un'euristica per determinare se un metodo o un campo appartiene a una classe?
- 27. Come ottenere tutti gli elementi di una lista per istanza?
- 28. Esiste un metodo convenzionale per invertire i valori NSColor?
- 29. Esiste un tale metodo per chiamare "getBackgroundColor"?
- 30. Come posso differenziare lo stesso nome di metodo di due protocolli in un'implementazione di classe?
Che cosa stai cercando di ottenere? –
@ RichardJ.RossIII Ho spesso usato la conformità del protocollo in cui ho bisogno di qualche oggetto generale per poter selezionare e quindi inviare il lavoro a un target appropriato (ad es. Un UITableViewDataSource 'universale per poter scegliere una cella appropriata per un dato oggetto e poi impostare quell'oggetto); Ritengo che sia più gestibile e richieda meno ridenominazioni affinché il dispatcher trovi gli obiettivi appropriati tramite il runtime e quindi li interroga su ciò che si aspettano. Qualche idea su quel modello? – Tommy