2009-01-26 10 views
1

HI, Je développe une application iphone en utilisant cocos2d. Son montré ce msg.L'application IPhone se termine en raison d'une exception non interceptée

2009-01-26 16:17:40.603 Find The Nuts[449:20b] *** -[NSCFArray onTimer:]: unrecognized selector sent to instance 0x59be030 
2009-01-26 16:17:40.605 Find The Nuts[449:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFArray onTimer:]: unrecognized selector sent to instance 0x59be030' 

ici onTimer est une méthode de compte à rebours. quelle est la solution pour cela?

Répondre

0

semble que vous ne fournissez pas une méthode valide à la minuterie pour appeler à la fin du compte à rebours. Vous devez définir le sélecteur de méthode et la cible sur des objets valides. voir l'exemple ci-dessous:

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; 

- (void)onTimer { 
    NSLog(@"hello!"]; 
} 

Peut-être que la cible est en cours de publication avant son retour?

Vous pouvez également essayer d'ajouter les points de rupture suivants qui seront interceptés lorsque l'exception se produira. Objc_exception_throw et - [élévation NSException]

Sur l'iPhone, je pense que toutes les exceptions passent par objc_exception_throw mais si vous ciblez Mac OS X Tiger ou plus tôt, vous devez définir un point d'arrêt sur les deux.

Il existe d'autres techniques de débogage à http://www.cocoadev.com/index.pl?DebuggingTechniques.

Tony

+0

Le la signature de la méthode doit être - (void) onTimer: (NSTimer *) someTimer – lostInTransit

4

Votre méthode de ontimer est envoyé à une instance de NSArray pour une raison quelconque. Il est probable que vous l'envoyiez accidentellement à une instance réelle de NSArray, ou que l'objet que vous essayez de l'envoyer ait été libéré (aka, n'est plus accessible) au moment où le timer se déclenche réellement.

Je voudrais essayer de faire un peu de débogage de la mémoire pour savoir si votre cible de minuterie est libérée à un moment inapproprié. Si tout semble correct, vérifiez que vous définissez bien la cible du temporisateur sur l'objet correct.

0

Pourquoi la méthode onTimer est appelée sur un objet NSArray? D'après votre description, je crois que ontimer a cette définition

-(void)onTimer:(NSTimer *)aTimer 

Dans ce cas, ontimer est une méthode de votre viewcontroller (ou d'une autre classe que vous avez créé), mais pas une méthode d'un tableau. Comment invoquez-vous la minuterie? La bonne façon de commencer une minuterie qui fera appel à cette méthode est cette

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 

La raison pour laquelle cette erreur se produit est soit vous n'êtes pas invoquez la minuterie correctement ou que vous utilisez un objet qui a été désallouée.

3

L'erreur de sélecteur non reconnue est probablement due au fait que vous transmettez le mauvais texte pour le paramètre @selector. Les noms des sélecteurs DOIVENT inclure les attributs ':' chaque fois qu'il y a un paramètre dans la signature. Donc, si vous avez une méthode de minuterie

-(void) onTimer:(NSTimer*)timer { ... } 

Le selecter vous passez à scheduledTimerWithTimeInterval doit être:

@selector(onTimer:) // note the ':' at the end of the name! 

L'appel complet NSTimer, serait alors ressembler à quelque chose comme:

[NSTimer scheduledTimerWithTimeInterval:1 
           target:self 
           selector:@selector(OnTimer:) // note the ':' 
           userInfo:nil 
           repeats:NO]; 
Questions connexes