J'ai des problèmes pour démarrer & en arrêtant NSTimers. Les docs disent qu'une minuterie est arrêtée par [timer invalidate];Problèmes d'invalidation et de recréation de NSTimer (s)
J'ai un objet timer déclaré en tant que tel
.h
NSTimer *incrementTimer;
@property (nonatomic, retain) NSTimer *incrementTimer;
.m
@synthesize incrementTimer;
-(void)dealloc {
[incrementTimer release];
[super dealloc];
}
-La d'habitude.
Quand il est nécessaire, ma méthode effectue les opérations suivantes:
-(void)setGenCount {
if(!condition1 && condition2) {
incrementTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(incrementBatteryVoltage:)
userInfo: nil
repeats: YES];
}
}
Tout fonctionne bien au-dessus. Cependant, une fois que cette minuterie fait son travail, je veux qu'elle s'invalide elle-même. J'invalide le timer car il existe une méthode de décrémentation équivalente qui pourrait être appelée et qui se battrait contre l'incrementTimer si elle était encore active. (Auparavant, j'ai remarqué que mes deux minuteries, si elle est active, ont agi sur le même Ivar en augmentant & diminuant la valeur (une sorte de combat) ... sans se briser) Le sélecteur appelé fonctionne comme suit:
-(void)incrementBatteryVoltage:(NSTimer *)timer {
if(battVoltage < 24.0) {
generatorDisplay.battVoltage += 0.1;
}
if(battery1Voltage == 24.0) {
[timer invalidate];
}
}
J'ai une méthode égale qui Décrémente le compte de la batterie. (précédemment mentionné)
En raison de ma conception de programme: l'interface simule un affichage de tension. Lorsque la "machine" est éteinte, je veux que toutes les minuteries soient invalidées, quelle que soit la valeur de la tension. Je fais ceci en vérifiant pour voir si le temporisateur est valide.
-(void)deEnergizeDisplays {
if([decrementTimer isValid]) {
[decrementTimer invalidate];
decrementTimer = nil;
}
if([incrementTimer isValid]) {
[incrementTimer invalidate];
incrementTimer = nil;
}
Je reçois de nombreux plantages "BAD_ACCESS". L'appel de ligne erroné pointe toujours vers mon appel [timer isValid]. Il semble que si le timer est invalidé ... le pointeur n'existe pas non plus. Je sais que le message [timer invalidate] désactive le minuteur, puis il est supprimé de la boucle d'exécution, puis il est libéré. Et ma compréhension est la suivante: c'est un objet autoreleased par son nom de coopération. Mes pensées sont les suivantes: Si j'envoie un message de rétention, la référence ne devrait-elle pas encore exister? J'ai essayé plusieurs combinaisons, ôtant:
timer = nil;
ou même au lieu de:
if([timer isValid])
J'ai essayé:
if([timer != nil])
et:
if(timer)
J'ai toujours obtenir le même accident. Merci pour toute aide sur le démarrage & arrêtant NSTimers.
Rien à voir avec votre accident , Je pense, mais vous ne voulez probablement pas vérifier les nombres à virgule flottante pour l'égalité explicite. –
Comment accompliriez-vous cette tâche? Vérifiez pour (battVoltage> 24)? –
C'est une meilleure façon de faire, oui. –