Comme l'a mentionné Kubi respondsToSelector
est normalement utilisé lorsque vous avez une instance d'une méthode qui se conforme à un protocole.
// Extend from the NSObject protocol so it is safe to call `respondsToSelector`
@protocol MyProtocol <NSObject>
// @required by default
- (void) requiredMethod;
@optional
- (void)optionalMethod;
@end
Avec une instance de ce protocole, nous pouvons appeler en toute sécurité n'importe quelle méthode requise.
id <MyProtocol> myObject = ...
[myObject requiredMethod];
Cependant, les méthodes optionnelles peuvent être implémentées ou non, vous devez donc vérifier au moment de l'exécution.
if ([myObject respondsToSelector:@selector(optionalMethod)])
{
[myObject optionalMethod];
}
Cela permet d'éviter un crash avec un sélecteur non reconnu.
De même, la raison pour laquelle vous devez déclarer les protocoles comme une extension de NSObjects, à savoir
@protocol MyProtocol <NSObject>
C'est parce que le protocole NSObject déclare l'élément respondsToSelector:
sélecteur. Sinon, XCode penserait qu'il n'est pas sûr de l'appeler.