acidente NSTimer com EXC_BAD_ACCESS no iPhone quando invalidar
-
22-07-2019 - |
Pergunta
Eu tenho configuração dois temporizadores no meu aplicativo que ambos se repete a cada alguns segundos. Tudo funciona bem, exceto quando é hora de invalidar os temporizadores. Quando o telefone está bloqueado, quero invalidar aqueles temporizadores e, em seguida, recriá-los quando o telefone é desbloqueado.
Im usando as notificações para perceber quando invalidar / criar os temporizadores.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];
Isto é o que o método notify_didBecomeActive contém:
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];
Este método notify_willResigneActive contém:
if (alarmTicker) {
[alarmTicker invalidate];
[alarmTicker release];
alarmTicker = NULL;
}
if (clockTicker) {
[clockTicker invalidate];
[clockTicker release];
clockTicker = NULL;
}
O problema é que quando eu depurar isso no segundo invalidate temporizador eu recebo o erro. O estranho é que se eu mudar as ordens dos temporizadores (como primeiro invalidar a clockTicker) .. Eu ainda tenho o erro no segundo timer.
O que eu poderia estar fazendo de errado?
Obrigado, Leonardo
Solução
lançamentos invalidar o timer, não há necessidade de liberar após invalidar, é por isso que o seu bater. Mas eu notei que você está retendo o temporizador ... eu não tenho certeza que isso é necessário também.
Outras dicas
Você só precisa definir alarmTicker e clockTicker a zero dentro dos métodos que os temporizadores de fogo e de que maneira, quando você faz a sua seleção se (alarmTicker) ou se (clockTicker) terão o valor correto.
Eu não sou certo o que ajustar o temporizador para NULL faz em oposição a defini-lo como nulo, mas eu sei que se você fizer uma chamada em um objeto nulo, é um não-op. Se você fazer uma chamada em um objeto NULL, ele acha que ele trava, embora eu não ter verificado isso. Este poder pós ajuda: NULL vs nulo em Objective-C