2010-08-09 5 views
3

Im utilisant beaucoup de minuteurs dans mon application. Pour l'heure d'enregistrement, l'objet en mouvement, l'évanouissement etc. J'utilise le même temporisateur pour plusieurs tentatives dans la même vue à des moments différents. Comment dois-je déclarer et invalider ou libérer mes timers correctement?Comment travailler avec NSTimer

Atm Im déclarant les minuteries comme ceci:

fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES]; 

et dès que je ne suis pas l'utiliser im faire:

[fadeTimer invalidate]; 
fadeTimer = nil; 

Retain comte quand je suis en laissant la vue est 0 à chaque minuteur. Dois-je libérer le chronomètre dans le dealloc? Mon application fonctionne assez bien, mais de temps en temps elle plante.

Le clockTimer que je l'utilise pour mettre à jour une étiquette avec le temps utilise

[[NSRunLoop mainRunLoop] addTimer:clockTimer forMode:NSRunLoopCommonModes]; 

Ai-je besoin de faire quelque chose avec ce MainLoop une fois que je l'invalident clockTimer?

Dans l'ensemble s'il vous plaît me soutenir avec quelques informations sur le travail avec des minuteries.

Merci beaucoup!

Joakim

Répondre

7

Vous n'êtes pas conserver vos minuteries correctement - si vous voulez les consulter à nouveau, vous devez les conserver. Je le fais avec une propriété à savoir dans votre tête de fichier

@property (nonatomic, retain) NSTimer *fadeTimer; 

et changer votre code pour dire

self.fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES]; 

// Put this whenever you want to remove your timer and in your dealloc method. 
[fadeTimer invalidate]; 
self.fadeTimer = nil; 

Cela fera en sorte que votre minuterie est retenu par votre objet. Sinon, vous devez juste espérer que la minuterie reste et ne soit pas libérée par l'iPhone. Et comme vous le dites, il se bloque de temps en temps, cela pourrait être la raison;)

Je crains de ne pas savoir beaucoup sur la boucle d'exécution, mais je suis confus pourquoi vous n'utilisez pas simplement un NSTimer normal pour planifier les choses - pourquoi dérange interagir avec la boucle d'exécution du tout?

+1

Pas tout à fait vrai; une minuterie "planifiée" est conservée par la boucle d'exécution. –

+0

Très vrai, mais je ne sais pas comment les minuteurs programmés agissent avec de longs délais d'attente ou dans des situations de mémoire faible etc etc - mieux vaut prévenir que guérir! – deanWombourne

3
  • Les temporisations planifiées sont conservées par la boucle d'exécution et conservent leur cible. Si vous voulez conserver la minuterie, vous devez sauter quelques cerceaux pour éviter un cycle de conservation (j'ai écrit une classe proxy non retenue, ce qui est un peu compliqué mais ça marche).
  • Ne pas manipuler la boucle d'exécution sauf si vous savez ce que vous faites (je ne sais pas). Une minuterie "planifiée" est déjà ajoutée à la boucle d'exécution principale. Si vous générez clockTimer comme fadeTimer, il est ajouté deux fois à la boucle d'exécution.
  • "de temps en temps il se bloque" n'aide personne. Exécutez-le dans le débogueur et voir où il se bloque. Il pourrait même imprimer des messages à la console si vous êtes chanceux.
-1
*also you can use and this is a better and optimize way to write this line 
if (theTimer != nil) { 
     if([theTimer isValid]){ 
      [theTimer invalidate]; 
     } 
     theTimer = nil; 
    }*