Auto-arrêt d'un timer.
tablier
Membre
Pour tester la présence du périphérique m600, j'utilise un timer comme ci dessous:
Quelqu'un a une idée la dessus?
Je souhaite que le timer se dé-valide de lui même si le m600 est connecté. J'ai donc mis le "invalidate" dans le callback. Je n'arrive pas à trouvé dans la doc si j'ai le droit de faire ça! Et si je n'ai pas le droit de faire ça, y a t-il une méthode pour le faire correctement?NSTimer *isPresent ;
BOOL present ;
- (void)metTimer
{
isPresent = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self
selector:@selector(testPresent) userInfo:nil repeats:YES];
}
- (void)testPresent
{
if ([o_m600 find_m600_device])
{ present = YES ;
[o_etat setStringValue:@m600 est connecté] ;
[isPresent invalidate] ;
}
else
{ if (!present) return ;
present = NO ;
[o_etat setStringValue:@m600 n'est pas connecté] ; } ;
}
Quelqu'un a une idée la dessus?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
A priori ça me semble bon. Je pense plutôt que si c'était interdit, ce serait précisé.
[edit]
Ah, à l'instant je vois même dans la doc que c'est autorisé !
"You can also invalidate a timer from the method it invokes. For example, the method invoked by the timer shown in “Initializing a Timer with a Fire Date†might look like this:" (cf: Timer programming topics, using Timers)
[/edit]
Dans ce genre de cas, si tu as un doute, tu peux essayer le performSelector:withObject:afterDelay: qui planifie le truc un peu plus tard dans la boucle événementielle. (qqchose comme [timer performSelector:@selector(invalidate) withObject:nil afterDelay:0])
Profitons-en pour rappeler qu'un NSTimer fait un retain de sa target, donc qu'il ne faut pas compter sur le dealloc de cette même target pour faire un invalidate du timer. Il faut bien le faire manuellement avant, sous peine de fuite mémoire. C'est nul mais c'est comme ça :-)
1) Qu'il ne se déclenchera plus à partir de la prochaine RunLoop
2) Qu'à moins que tu aies fait un retain explicite (ce qui n'est pas ton cas dans ton code), le timer est détruit.
En effet, "scheduledTimerWithInteral..." crée le timer et l'ajoute (le "schedule") dans la RunLoop, et c'est cette dernière qui retient le timer (retain implicite du Timer par la RunLoop), et qui va le relâcher (release implicite) quand le timer sera retiré de la RunLoop via un appel à "invalidate".
Donc pas de soucis, tu peux appeler "invalidate" dans la callback comme tu le fais dans ton code.
Cependant deux petites remarques :
Ce qui évite de plus de risquer d'utiliser le NSTimer "isPresent" par erreur après qu'il a été invalidé (et don releasé et détruit) " si tu n'as pas d'ivar pointant dessus, tu ne risques pas de l'utiliser à mauvais escient.
Si tu préfères garder l'ivar quand même, je te conseille " juste par mesure de précaution et par bonne habitude " de mettre alors cette variable isPresent à nil juste après l'appel à invalidate.
[EDIT] Grillé par Chacha
ça doit faire un an que c'est pas arrivé.
Un petit digestif pour fêter ça ?
Pour le digestif, je suis partant!