2010-09-20 39 views
2

J'ai une classe avec une variable NSTimer *myTimer;. À un moment donné que je fais:NSTimer ne s'arrête pas

myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(doStuff) userInfo:nil repeats: YES]; 

plus loin, j'ai une méthode:

- (void)doStuff 
{ 
    if(myTimer) 
    { 
    //do stuff 
    } 
} 

et j'arrêter mon chronomètre lorsque la classe est libérée par:

- (void)dealloc 
{ 
if (myTimer) { //if myTimer==nil it already has been stopped in the same way 
    [myTimer invalidate]; 
    myTimer = nil; 
} 
} 

Maintenant, le problème est-ce que lorsque je relâche la classe, la minuterie s'allume encore et encore et déclenche l'événement de toute façon. Est-ce que je fais quelque chose de mal? Il semble que la méthode dealloc est jamais appelé, sinon myTimer serait nul et même si le sélecteur est tiré, il ne serait pas aller dans le if(myTimer)

Répondre

7

Cela ne marchera jamais, parce que les minuteries conservent leur cible, ce qui signifie que votre méthode dealloc ne sera jamais être appelé jusqu'à après vous avez invalidated le minuteur.

Pour plus d'informations, consultez la documentation NSTimer et ce billet de blog sur "Dangerous Cocoa Calls"

+2

Vous devriez donc nettoyer la minuterie avant de vous attendre à ce que l'objet disparaisse. –

+0

@Joshua +1 c'est ce que j'ai dit ... vous devez "invalider" le timer pour obtenir votre objet 'released', ce qui peut finir par déclencher la méthode' dealloc' (juste pas en tant de mots) :) –

0

Avez-vous essayé les outils de débogage à portée de main à votre disposition? Que se passe-t-il si vous définissez un point d'arrêt dans votre méthode dealloc? En outre, vous devriez poster plus de contexte autour de votre création. Est-il possible que vous créiez le chronomètre plus d'une fois, remplaçant ainsi l'original (mais ne l'invalidant pas) et le laissant là à feu à volonté?

+0

yep .. n'atteignant pas dealloc – Daniel

+0

Je ne le crée pas plus d'une fois. Seulement à un endroit, et seulement une fois. – Daniel