12
votes

Nstimer se bloque lorsque j'appelle [la minuterie isvalid] ou [la minuterie invalide]

J'ai deux nstimers dans mon application iPhone. DÉCRENASEASETIMER fonctionne bien, mais Timercountseconds se bloque lorsque j'appelle [Timercountseconds Isvalid] ou [Timercountseconds Invalidate]. Ils sont utilisés comme ceci:

-(id)initialize { //Gets called, when the app launches and when a UIButton is pressed
 if ([timerCountSeconds isValid]) {
  [timerCountSeconds invalidate];
 } 
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //Gets called, when you begin touching the screen
 //....
 if ([decreaseTimer isValid]) {
   [decreaseTimer invalidate];
  }
 timerCountSeconds = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
 //....
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {//Gets called, when you stop touching the screen(not if you press the UIButton for -(id)initialize)
 //...
 decreaseTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(decrease) userInfo:nil repeats:YES];
 //...
}
-(void)comept3 { //Gets calles when you rubbed the screen a bit
    if ([timerCountSeconds isValid]) {
    [timerCountSeconds invalidate];
    }
}


4 commentaires

Avez-vous initialement initialisé les secondes et diminuer la minuterie?


Je les ai déclarés dans le fichier d'en-tête ... Je les ai initialisés dans les méthodes "touchées" et "touchesbegan"


Montrer plus de code. En outre, avoir des noms comme décréditimer par exemple variables est généralement une très mauvaise idée. Les noms commençant par une lettre majuscule sont utilisés pour les classes et les structures. Pensez à utiliser un style cohérent que Apple préconise.


D'accord, j'ai changé les noms de variables ... J'ai oublié d'entrer la méthode "comept3" ... Cela vous aidera probablement à m'aider;)


5 Réponses :


0
votes

Vous devez réellement initialiser le Timercountseconds CODE> et DÉCRENDASETIMER CODE> Membres de l'initialisation. En supposant que votre flux de contrôle est la suivante: xxx pré>

puis lorsque vous appelez initialize code> timercountseconds code> n'a pas été initialisé, donc vous faites logiquement P>

[<random pointer> isValid]


1 commentaires

Si ce sont des variables d'instance, elles ne sont pas des "pointeurs aléatoires" - ils sont nuls.



3
votes

Très probablement, la minuterie stockée dans cette variable a déjà été traitée. Vous devez le conserver si vous voulez le garder autour d'une période arbitraire longue.


3 commentaires

Quand sera-t-il distribué? Alors, quand dois-je le retenir?


Il sera distribué lorsque l'exécution de l'exécution peut être traitée. Si vous voulez le garder, vous devez le conserver lorsque vous le stockez quelque part, comme avec tout autre objet.


ok je pense que j'ai compris;) Je l'ai conservé après l'initialisation ... Maintenant, cela ne se plante plus :) Est-ce exact?



24
votes

Vous devez définir un objet nstimer sur nil après que vous Invalidate IT, puisque l'appel invalidez méthode appelez également fait un libérant (selon les documents Apple). Si vous ne le faites pas, appelez une méthode sur celle-ci comme isvalid pourrait causer votre crash.


1 commentaires

DOUPLE UP-VOTE - cherché ce problème pendant des heures ... BTW: C'est peut-être très sensible à conserver le NSTIMER s'il est vérifié ailleurs avec Isvalid. S'il n'est pas conservé, il peut être libéré automatiquement lorsqu'il est tiré (voir également la réponse du mandrin).



3
votes
 [objTimer retain];
Then it will not crash any time. Use this after initializing the timer so it will work fine....

0 commentaires

1
votes

Vous devez définir la minuterie dans le fil principal. Nstimer ne sera pas tiré dans le fil d'arrière-plan.

  • objc: XXX

  • SWIFT: XXX


0 commentaires