Сбой NSTimer с EXC_BAD_ACCESS на Iphone при аннулировании
-
22-07-2019 - |
Вопрос
В своем приложении я установил два таймера, которые повторяются каждые несколько секунд.Все работает нормально, за исключением случаев, когда пришло время аннулировать таймеры.Когда телефон заблокирован, я хочу аннулировать эти таймеры, а затем воссоздать их, когда телефон разблокирован.
Я использую уведомления, чтобы понять, когда сделать таймеры недействительными/создать.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];
Вот что содержит метод notify_didBecomeActive:
clockTicker = [[NSTimer scheduledTimerWithTimeInterval: 1
target: self
selector: @selector(showActivity)
userInfo: nil
repeats: YES] retain];
alarmTicker = [[NSTimer scheduledTimerWithTimeInterval: CONST_ALARMTIMER
target: self
selector: @selector(checkAndLaunchAlarm)
userInfo: nil
repeats: YES] retain];
Этот метод notify_willResigneActive содержит:
if (alarmTicker) {
[alarmTicker invalidate];
[alarmTicker release];
alarmTicker = NULL;
}
if (clockTicker) {
[clockTicker invalidate];
[clockTicker release];
clockTicker = NULL;
}
Проблема в том, что когда я отлаживаю это при втором отключении таймера, я получаю ошибку.Странно то, что если я переключу порядок таймеров (например, сначала объявлю недействительным clockTicker)..Я все еще получаю ошибку на втором таймере.
Что я могу делать неправильно?
Спасибо, Леонардо
Решение
инвалидация освобождает таймер, его не нужно освобождать после аннулирования, поэтому он выходит из строя.Но я только что заметил, что вы сохраняете таймер... я тоже не уверен, что это необходимо.
Другие советы
Вам просто нужно установить для AlarmTicker и clockTicker значение nil внутри методов, которые срабатывают эти таймеры, и таким образом, когда вы будете проверять, будут ли (alarmTicker) или if ( clockTicker) иметь правильное значение.
Я не уверен, что делает установка таймера на NULL в отличие от установки его на ноль, но я знаю, что если вы выполняете вызов нулевого объекта, это не работает.Если вы вызываете объект NULL, он думает, что происходит сбой, хотя я это не проверял.Этот пост может помочь: NULL против нуля в Objective-C