Risposte:
C'è anche il messaggio statico InstanceRespondToSelector: (SEL) selector Lo chiameresti così:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
o così:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Questo può essere utile se desideri chiamare un costruttore o un altro a seconda di questo (voglio dire, prima di avere l'istanza stessa).
Usa respondsToSelector:
. Dalla documentazione :
respondsToSelector:
Restituisce un valore booleano che indica se il destinatario implementa o eredita un metodo che può rispondere a un messaggio specificato.
- (BOOL)respondsToSelector:(SEL)aSelector
Parametri
aSelector - Un selettore che identifica un messaggio.Valore restituito
YES
se il destinatario implementa o eredita un metodo che può rispondere a aSelector , altrimentiNO
.
Stai cercando replysToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Come dice Donal, quanto sopra ti dice che foo può sicuramente gestire la ricezione del selettore della barra. Tuttavia, se foo è un proxy che inoltra bar a qualche oggetto sottostante che riceverà il messaggio bar, allora replysToSelector: ti dirà NO, anche se il messaggio verrà inoltrato a un oggetto che risponde a bar.
Il controllo dei selettori con respondsToSelector è normalmente solo per i metodi delegati. Non dovresti usare forwardInvocation o proxy per i metodi delegati. Se hai bisogno di usare replysToSelector in altre situazioni potresti voler assicurarti che non ci sia un modo più appropriato per progettare il tuo programma.
- forwardInvocation:
).