Vérifier si une méthode existe

Est-il possible de tester si une méthode existe dans Objective-C?

J’essaie d’append un garde pour voir si mon object a la méthode avant de l’appeler.

 if ([obj respondsToSelector:@selector(methodName:withEtc:)]) { [obj methodName:123 withEtc:456]; } 

Il y a aussi le message statique instancesRespondToSelector: (SEL) sélecteur Vous l’appelleriez 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 :

répond àTélecteur:

Renvoie une valeur booléenne indiquant si le récepteur implémente ou hérite d’une méthode capable de répondre à un message spécifié.

 - (BOOL)respondsToSelector:(SEL)aSelector 

Paramètres
aSelector – Un sélecteur qui identifie un message.

Valeur de retour
YES si le récepteur implémente ou hérite d’une méthode capable de répondre à un sélecteur , sinon NO .

Vous recherchez respondsToSelector: –

 if ([foo respondsToSelector: @selector(bar)] { [foo bar]; } 

Comme le dit Donal, ce qui précède vous indique que foo peut définitivement gérer la réception du sélecteur de barre. Toutefois, si foo est un proxy qui transfère la barre à un object sous-jacent qui recevra le message de barre, respondsToSelector: vous indiquera NON, même si le message sera transféré à un object qui répond à la barre.

La vérification des sélecteurs avec respondsToSelector ne concerne normalement que les méthodes déléguées. Vous ne devriez pas utiliser forwardInvocation ou des proxies pour les méthodes déléguées. Si vous devez utiliser respondsToSelector dans d’autres situations, vous pouvez vous assurer qu’il n’existe pas de méthode plus appropriée pour concevoir votre programme.