Сбой NSTimer с EXC_BAD_ACCESS на Iphone при аннулировании - PullRequest
3 голосов
/ 18 сентября 2009

В моем приложении установлены два таймера, которые повторяются каждые несколько секунд. Все работает отлично, кроме случаев, когда пришло время аннулировать таймеры. Когда телефон заблокирован, я хочу сделать эти таймеры недействительными, а затем восстановить их, когда телефон разблокирован.

Я использую уведомления, чтобы понять, когда сделать недействительными / создать таймеры.

    [[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) .. Я все еще получаю ошибку во втором таймере.

Что я мог делать не так?

Спасибо, Леонардо

Ответы [ 3 ]

5 голосов
/ 18 сентября 2009

invalidate освобождает таймер, нет необходимости его отпускать, поэтому его сбой. Но я только что заметил, что вы сохраняете таймер ... я тоже не уверен, что это необходимо.

0 голосов
/ 03 августа 2012

Вам просто нужно установить значения alarmTicker и clockTicker равными nil внутри методов, которые запускаются этими таймерами, и таким образом, когда вы проверяете, имеют ли (alarmTicker) или if (clockTicker) правильное значение.

0 голосов
/ 07 ноября 2009

Я не уверен, что установка таймера в NULL делает в отличие от установки его в ноль, но я знаю, что если вы делаете вызов для объекта nil, это неоперация. Если вы делаете вызов для объекта NULL, он думает, что он падает, хотя я не проверял это. Этот пост может помочь: NULL против nil в Objective-C

...