Réponses:
Il y a aussi le message statique instancesRespondToSelector: (SEL) selector Vous l'appeleriez comme ceci:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
ou comme ça:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Cela peut être utile si vous souhaitez appeler un constructeur ou un autre en fonction de cela (je veux dire, avant d'avoir l'instance elle-même).
Utilisez respondsToSelector:. De la documentation :
respondsToSelector:
Renvoie une valeur booléenne qui indique si le récepteur implémente ou hérite d'une méthode capable de répondre à un message spécifié.
- (BOOL)respondsToSelector:(SEL)aSelectorParamètres
aSelector - Un sélecteur qui identifie un message.Valeur de retour
YESsi le récepteur implémente ou hérite d'une méthode qui peut répondre à un sélecteur , sinonNO.
Vous recherchez des répondsToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Comme Donal le dit, ce qui précède vous dit que foo peut certainement gérer la réception du sélecteur de barre. Cependant, si foo est un proxy qui transmet la barre à un objet sous-jacent qui recevra le message de barre, alors respondsToSelector: vous dira NON, même si le message sera transféré à un objet qui répond à la barre.
La vérification des sélecteurs avec respondsToSelector est normalement réservée aux méthodes déléguées. Vous ne devriez pas utiliser forwardInvocation ou proxy pour les méthodes de délégué. Si vous devez utiliser respondsToSelector dans d'autres situations, vous voudrez peut-être vous assurer qu'il n'y a pas de manière plus appropriée de concevoir votre programme.
- forwardInvocation:).