2 votes

Sélecteur non reconnu pour appeler la méthode

- (NSDictionary*)convertMessage:(Message*)event
{
    // if this gets called then a derived class either didn't override this function or it called [super convertEvent:event]
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

Je m'attends à ce que la valeur du résultat soit nulle.

-(void)calling{

 NSDictionary *dictionary  = [self convertMessage:evt];

}

Mais il dit que le sélecteur non reconnu a été envoyé à l'instance pour le bloc d'erreur ! lors de l'exécution !

2voto

Bryan Chen Points 14689

La mise en œuvre de [self doesNotRecognizeSelector:_cmd] est de lancer une exception. le résultat attendu est donc une exception levée. si vous attendez un retour nul, il suffit de retourner nil dans la méthode et de faire no appelez doesNotRecognizeSelector:

se référer à doc de la pomme

Le système d'exécution invoque cette méthode chaque fois qu'un objet reçoit un message un message aSelector auquel il ne peut pas répondre ou qu'il ne peut pas transmettre. Cette méthode, en soulève une NSInvalidArgumentException et génère un message d'erreur. d'erreur.

Tout message doesNotRecognizeSelector : est généralement envoyé uniquement par le système d'exécution. Toutefois, ils peuvent être utilisés dans le code du programme pour empêcher une méthode méthode d'être héritée. Par exemple, une sous-classe de NSObject pourrait renoncer à la méthode copy ou init en la réimplémentant pour inclure un message doesNotRecognizeSelector : message comme suit :

- (id)copy {
    [self doesNotRecognizeSelector:_cmd];
}

La variable _cmd est un argument caché passé à chaque méthode qui est le sélecteur actuel ;

dans cet exemple, il identifie le sélecteur de la méthode de copie. Ce code empêche les instances de la sous-classe de répondre aux messages de copie ou les superclasses de transmettre des messages de copie, bien que la fonction respondsToSelector : signalera quand même que le récepteur a accès à une une méthode de copie.

Si vous surchargez cette méthode, vous devez appeler super ou lever un ou lever une exception NSInvalidArgumentException à la fin de votre implémentation. En d'autres termes, cette méthode ne doit pas revenir normalement ; elle doit toujours entraîner l'émission d'une exception.

2voto

Nikolai Ruhe Points 45433

Pour prolonger la réponse de @xlc0212 :

L'implémentation originale de la méthode...

[self doesNotRecognizeSelector:_cmd];
return nil;

... ne s'attendait pas à atteindre le return déclaration. Comme expliqué par @xlc0212 doesNotRecognizeSelector lèverait une exception, conduisant à la fin anormale du processus.

L'auteur de l'implémentation a seulement mis le return pour faire taire un avertissement du compilateur. Une manière plus moderne et moins confuse de faire cela serait d'indiquer à clang que ce point du code ne peut être atteint :

- (NSDictionary*)convertMessage:(Message*)event
{
    [self doesNotRecognizeSelector:_cmd];
    __builtin_unreachable();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X