Question

J'ai un objet que je dois NSTimer invalider si un utilisateur tape sur un bouton ou si elles sortent de vue.

J'ai donc:

[myNSTimer invalidate];

dans mon gestionnaire de bouton et à l'intérieur viewWillDisappear. Si l'utilisateur tape sur un bouton et existe alors une vue de l'application renvoie une exception, car a déjà été myNSTimer invalidée. Ce que je dois faire dans la méthode est de vérifier si <=> l'a été invalidée <=> ou non. Comment puis-je faire?

J'ai essayé:

if(myNSTimer != nil)
  [myNSTimer invalidate];

mais cela ne fonctionne pas.

Était-ce utile?

La solution

Une fois que vous invalidez la minuterie, il suffit d'appeler là-dessus release (en supposant que vous avez retenu la référence que vous tenez à), puis nul votre référence. De cette façon, lorsque vous quittez la vue, en essayant d'invalider la minuterie une deuxième fois il suffit d'appeler cette méthode sur la place nulle, qui ne fait rien.

Vous pouvez utiliser pour vérifier si -[NSTimer isValid] il est valide avant invalidant, mais il n'y a vraiment aucune raison de garder votre référence après avoir désactivé la première fois de toute façon. En outre, si votre vrai problème est que vous n'avez pas retenu votre référence et donc la première vous laisse en fait -invalidate avec une référence pointant un objet libéré, puis en appelant ne sera pas utile -isValid de toute façon.

Autres conseils

Qu'est-ce que je fais habituellement est nul-la variable élément de maintien de la minuterie, soit quand il se déclenche, ou quand je l'invalident. Ensuite, vous pouvez le faire simplement:

[myNSTimer invalidate]; 
myNSTimer = nil;

et ça va faire la bonne chose.

J'ai eu le même problème alors que je tentais de faire une pause et redémarrer une minuterie. Pour arrêter:

[timer invalidate];
[timer release];
timer = nil;

Et pour démarrer / redémarrer:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain];

Maintenant, il ne se bloque pas quand je l'invalident.

Swift:

if timer.valid {
   timer.invalidate()
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top