У меня проблемы с запуском и остановкой NSTimers. В документах говорится, что таймер остановлен с помощью [timer invalidate];
У меня есть объект таймера, объявленный таким образом
.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, если бы он все еще был активным. (Ранее я заметил, что два моих таймера, если они были активны, действовали на один и тот же ивар, увеличивая и уменьшая значение (своего рода бой) ... без сбоев) Вызываемый селектор работает следующим образом:
-(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 invalidate] отключает таймер, а затем удаляется из цикла выполнения и затем освобождается. И мое понимание таково: это автоматически выпущенный объект в соответствии с соглашением об именах.
Я подумала: если я отправляю сообщение сохранения, разве ссылка не должна существовать? Я пробовал несколько комбинаций, убирая:
timer = nil;
или даже вместо:
if([timer isValid])
Я пытался:
if([timer != nil])
и:
if(timer)
У меня всегда один и тот же сбой. Спасибо за любую помощь по запуску и остановке NSTimers.