2008-12-15 27 views
12

Tengo un objeto NSTimer que necesito invalidar si un usuario toca un botón o si salen de una vista.Cómo comprobar si NSTimer ya ha sido invalidado

por lo que tengo:

[myNSTimer invalidate]; 

dentro de mi controlador de botón y en el interior viewWillDisappear. Si el usuario toca un botón y luego existe una vista, la aplicación arroja una excepción porque myNSTimer ya ha sido invalidado. Lo que necesito hacer en el método viewWillDisappear es verificar si el myNSTimer ha sido invalidado o no. ¿Cómo puedo hacer eso?

que he probado:

if(myNSTimer != nil) 
    [myNSTimer invalidate]; 

pero eso no funcionó.

Respuesta

33

Una vez que invalide el temporizador, simplemente llame al release (suponiendo que haya conservado la referencia a la que se aferra) y luego anule su referencia. De esa manera, cuando salga de la vista, tratar de invalidar el temporizador una segunda vez simplemente llamará a ese método en lugar de cero, lo que no hace nada.

Como alternativa, puede usar -[NSTimer isValid] para comprobar si es válido antes de invalidar, pero realmente no hay motivo para conservar su referencia después de invalidarla la primera vez. Además, si su problema real es que no ha conservado su referencia y por lo tanto, el primer -invalidate en realidad le deja con una referencia apuntando a un objeto liberado, entonces llamar al -isValid no ayudará de todos modos.

+0

Gracias por su respuesta! –

+0

Esa es una explicación clara. ¡Gracias! –

+0

Esa fue exactamente la solución para mi problema 'mensaje enviado a instancia desasignada'. Gracias. – High6

6

Lo que suelo hacer es nulo la variable miembro que contiene el temporizador, ya sea cuando se dispara o cuando lo invalido. Luego puede hacer:

[myNSTimer invalidate]; 
myNSTimer = nil; 

y hará lo correcto.

3

He tenido el mismo problema mientras intentaba pausar & reiniciar un temporizador. Para detenerlo:

[timer invalidate]; 
[timer release]; 
timer = nil; 

Y para iniciar/reiniciar:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain]; 

Ahora que no se desplome cuando invalidarla.

1

Swift:

if timer.valid { 
    timer.invalidate() 
} 
Cuestiones relacionadas