quand utiliser respondsToSelector en objective-c
- (void)someMethod
{
if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
{
if ( [delegate operationShouldProceed] )
{
//do something appropriate
}
}
}
La la documentation dit:
La précaution est nécessaire uniquement pour les méthodes optionnelles dans un protocole formel ou méthodes informelles de ce protocole
Ça veut dire quoi? Si j'utilise un protocole officiel je peux utiliser [delegate myMethod]
?
Vous devez vous connecter pour publier un commentaire.
Vous utilisez de manière assez juste quand vous pensez que vous avez besoin de: pour vérifier si un objet implémente la méthode que vous êtes sur le point d'appel. Généralement cela est fait quand vous avez une option de méthodes ou de façon plus informelle du protocole.
Je n'ai jamais utilisé
respondsToSelector
quand je suis en train d'écrire du code qui doit communiquer avec un délégué de l'objet.Parfois, vous pouvez l'utiliser
respondsToSelector
sur une méthode qui retourne etid
ou génériqueNSObject
où vous n'êtes pas sûr de ce que la classe de l'objet retourné est.self.delegate
est exactement le même que l'appel à la[self delegate]
. Dans mon code il n'y a pas de différence entre[self.delegate someMethod]
et[_delegate someMethod]
, mais j'ai tendance à utiliser la syntaxe à point, car il garde tout droit dans mon esprit, les variables sont locales à la méthode que je suis, et qui sont variables d'instance.Juste à ajouter à ce que @kubi a dit, l'autre fois que je l'utilise, c'est quand une méthode a été ajouté à une pré-existants de la classe dans une version plus récente des cadres, mais j'ai encore besoin d'être rétro-compatible. Par exemple:
Comme kubi mentionné
respondsToSelector
est généralement utilisé lorsque vous avez un exemple d'une méthode qui est conforme à un protocole.Donné et de l'instance de ce protocole, nous pouvons appeler de toute méthode.
Cependant, les méthodes optionnelles peuvent ou ne peuvent pas être mis en œuvre, de sorte que vous besoin de vérifier au moment de l'exécution.
Faire cela permettra d'éviter une collision avec un méconnu sélecteur.
Aussi, la raison pour laquelle vous devez déclarer les protocoles comme une extension de NSObjects, c'est à dire
Est parce que le NSObject protocole déclare le
respondsToSelector:
sélecteur. Sinon XCode pense que c'est dangereux pour l'appeler.Vieille question, mais j'ai appris à être très cautios avec l'aide des trucs comme addTarget:@selector(fu:) parce que le nom de la méthode n'est pas contrôlée, ni inclus dans refactoring par XCODE. Cela m'a causé des problèmes déjà. Alors maintenant, j'ai fait un habbit de toujours intégrer des trucs comme addTarget ou addObserver dans un respondsToSelector-Vérifier comme suit:
Je sais que c'est pas super élégant, mais je préfère ajouter un peu de code réutilisable, que d'avoir un crash inattendu de mes applications dans l'App Store.
@selector(date)
au lieu de@selector(data)
XCode ne vous avertira pas parce que ledate
sélecteur existe surNSDateComponents
.