NSTimer se bloquea con EXC_BAD_ACCESS en Iphone cuando se invalida
-
22-07-2019 - |
Pregunta
He configurado dos temporizadores en mi aplicación que se repiten cada pocos segundos. Todo funciona bien, excepto cuando es hora de invalidar los temporizadores. Cuando el teléfono está bloqueado, quiero invalidar esos temporizadores y luego volver a crearlos cuando el teléfono está desbloqueado.
Estoy usando las notificaciones para saber cuándo invalidar / crear los 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];
Esto es lo que contiene el método 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];
Esto contiene el método notify_willResigneActive:
if (alarmTicker) {
[alarmTicker invalidate];
[alarmTicker release];
alarmTicker = NULL;
}
if (clockTicker) {
[clockTicker invalidate];
[clockTicker release];
clockTicker = NULL;
}
El problema es que cuando depuro esto en la segunda invalidación del temporizador obtengo el error. Lo extraño es que si cambio el orden de los temporizadores (como invalidar primero el clockTicker) ... aún obtengo el error en el segundo temporizador.
¿Qué podría estar haciendo mal?
Gracias Leonardo
Solución
invalidate libera el temporizador, no es necesario liberarlo después de invalidar, por eso se bloquea. Pero acabo de notar que retiene el temporizador ... tampoco estoy seguro de que esto sea necesario.
Otros consejos
Solo necesita configurar alarmTicker y clockTicker en cero dentro de los métodos que activan esos temporizadores y de esa manera cuando verifica si (alarmTicker) o if (clockTicker) tendrán el valor correcto.
No estoy seguro de qué establecer el temporizador en NULL en lugar de establecerlo en nulo, pero sé que si realiza una llamada en un objeto nulo, es un no-op. Si realiza una llamada en un objeto NULL, cree que se bloquea, aunque no he verificado esto. Esta publicación podría ayudar: NULL vs nil en Objective-C