У меня проблемы с запуском и остановкой NSTimers. В документах говорится, что таймер остановлен [таймер недействителен];
У меня есть объект таймера, объявленный как таковой
.h
NSTimer *incrementTimer;
@property (nonatomic, retain) NSTimer *incrementTimer;
.m
@synthesize incrementTimer;
-(void)dealloc {
[incrementTimer release];
[super dealloc];
}
-Обычно.
Когда это необходимо, мой метод делает следующее:
-(void)setGenCount {
if(!condition1 && condition2) {
incrementTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(incrementBatteryVoltage:)
userInfo: nil
repeats: YES];
}
}
Все выше работает нормально. Однако, как только этот таймер выполнит свою работу, я хочу, чтобы он аннулировал себя. Я аннулирую таймер, потому что есть метод равного уменьшения, который можно было бы вызвать и который будет бороться с incrementTimer, если он все еще активен. (Ранее я заметил, что два моих таймера, если они активны, действовали на один и тот же ivar, увеличивая и уменьшая значение (своего рода борьба)... без сбоев) Вызванный селектор работает следующим образом:
-(void)incrementBatteryVoltage:(NSTimer *)timer {
if(battVoltage < 24.0) {
generatorDisplay.battVoltage += 0.1;
}
if(battery1Voltage == 24.0) {
[timer invalidate];
}
}
У меня есть равный метод, который уменьшает количество батарей. (упоминалось ранее)
Из-за особенностей моей программы: интерфейс имитирует отображение напряжения. Когда «машина» выключена, я хочу, чтобы все таймеры были признаны недействительными, независимо от того, какое значение напряжения. Я делаю это, проверяя, действителен ли таймер.
-(void)deEnergizeDisplays {
if([decrementTimer isValid]) {
[decrementTimer invalidate];
decrementTimer = nil;
}
if([incrementTimer isValid]) {
[incrementTimer invalidate];
incrementTimer = nil;
}
Я получаю многочисленные сбои "BAD_ACCESS". Ошибочный вызов линии всегда указывает на мой вызов [timer isValid]. Кажется, что если таймер недействителен... указатель тоже не существует. Я знаю, что сообщение [таймер недействителен] отключает таймер, затем он удаляется из цикла выполнения, а затем освобождается. И я так понимаю: это автоматически выпускаемый объект в соответствии с его соглашением об именах.
Моя мысль такова: если я отправляю сообщение об удержании, не должна ли ссылка все еще существовать? Я пробовал несколько комбинаций, забирая:
timer = nil;
или даже вместо:
if([timer isValid])
Я пытался :
if([timer != nil])
и:
if(timer)
Я всегда получаю один и тот же сбой. Спасибо за любую помощь в запуске и остановке NSTimers.