Сбой NSTimer с EXC_BAD_ACCESS на Iphone при аннулировании

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

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

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

Что я могу делать неправильно?

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


person Homer1980ar    schedule 18.09.2009    source источник


Ответы (3)


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

person Daniel    schedule 18.09.2009
comment
Возможно.. но в любом случае это не работает. Вылетает второй таймер, а не строка релиза. Я не могу получить много информации .. постараюсь включить зомби, чтобы увидеть, есть ли что-то, что я упускаю. - person Homer1980ar; 22.09.2009

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

person fdiaz    schedule 03.08.2012

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

person Matt Long    schedule 06.11.2009