2011-06-16 5 views
0

je le code suivant lequel je teste:NSInvocation setSelector jette une exception

NSString * parameterSignature = @"@:"; 
NSMethodSignature * signature = [NSMethodSignature signatureWithObjCTypes:[parameterSignature UTF8String]]; 
NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:@selector(aMethodWithNoParms)]; 

Lorsque le setSelector exécute je reçois cette erreur:

Name: NSInvalidArgumentException 
File: Unknown 
Line: Unknown 
Reason: -[NSInvocation setArgument:atIndex:]: index (1) out of bounds [-1, 0] 

J'ai la traîne sur le net à la recherche de la raison et non trouvé. On dirait qu'il essaie de définir le deuxième paramètre de l'appel qui serait le sélecteur, mais le tableau n'est pas assez long. J'aurais pensé que la création de l'invocation aurait configuré le tableau.

Je ne sais pas comment résoudre ce problème, tout le monde voit ce que j'ai fait de mal?

+0

pourriez-vous fournir la déclaration de méthode aMethodWithNoParms? – Radu

+0

essayez avec une méthode de sélection qui a un argument comme ceci - (void) SetSelectorMethod: (id) expéditeur – Radu

Répondre

3

Si votre méthode ne retourne rien dire qu'elle a un type void de retour, votre signature de la méthode sera,

NSString * parameterSignature = @"[email protected]:"; 

indiquant void type de retour, self et _cmd. Vous devez de préférence utiliser methodSignatureForSelector: ou instanceMethodSignatureForSelector: pour obtenir la signature du procédé.

+0

Ahh le type de retour, c'est ce que j'ai raté. Merci. – drekka

3

Je pense que le premier caractère de la chaîne C doit être le type de retour. Il devrait donc être

"@@:" 

si la méthode renvoie un objet. Votre chaîne définit une méthode avec un type d'objet de retour et un paramètre qui est un sélecteur. En fait, vous avez besoin au minimum du type de retour, du type de récepteur et du type de sélecteur.

Voir this discussion.

+0

Ahh le type de retour, c'est ce que j'ai manqué. Merci. – drekka

Questions connexes