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]; } }
5 Réponses :
Vous devez réellement initialiser le puis lorsque vous appelez Timercountseconds CODE> et
DÉCRENDASETIMER CODE> Membres de l'initialisation. En supposant que votre flux de contrôle est la suivante:
initialize code>
timercountseconds code> n'a pas été initialisé, donc vous faites logiquement P>
[<random pointer> isValid]
Si ce sont des variables d'instance, elles ne sont pas des "pointeurs aléatoires" - ils sont nuls.
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. P>
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?
Vous devez définir un objet nstimer code> sur
nil code> après que vous
Invalidate code> IT, puisque l'appel code> invalidez code> méthode appelez également fait un
libérant code> (selon les documents Apple). Si vous ne le faites pas, appelez une méthode sur celle-ci comme
isvalid code> pourrait causer votre crash. P>
DOUPLE UP-VOTE - cherché ce problème pendant des heures ... BTW: C'est peut-être très i> 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).
[objTimer retain]; Then it will not crash any time. Use this after initializing the timer so it will work fine....
Vous devez définir la minuterie dans le fil principal. Nstimer ne sera pas tiré dans le fil d'arrière-plan.
objc: p>
SWIFT: P>
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 code> 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;)