iPhone crash- Mensaje enviado a la instancia desasignada

Ok, aquí está el error que recibo:

    -[CFRunLoopTimer invalidate]: message sent to deallocated instance 0x109b05a0 (gdb)

Aquí está el código que causa el bloqueo:

    if (waitingOpponentTimer) {
      [waitingOpponentTimer invalidate]; //<-- Crash/error occurs here
      waitingOpponentTimer = nil;
    }

Y en otro lugar:

    NSTimer* waitingOpponentTimer;

Y también

    waitingOpponentTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO];

No hay ninguna otra ocurrencia de waitingOpponentTimer en ninguna parte, solo las que he mostrado arriba. waitingOpponentTimeOut acción solo establece algunas variables y no hace nada a los temporizadores o a waitOpponentTimer.

He intentado todas las siguientes declaraciones IF para evitar que se llegue a la declaración de invalidación:

    if (waitingOpponentTimer) {
    if ([waitingOpponentTimer retainCount] > 0) {
    if (waitingOpponentTimer.isValid) {
    if (waitingOpponentTimer != nil) {

Pero en todos los casos, todavía pasa a través de la declaración IF y luego causa el bloqueo con la declaración de invalidación.

Así que mi pregunta es, ¿por qué / cómo se invalida causando un error cuando el objeto es Válido y no es nulo y es RetenerCount es mayor que cero?

¿Hay otra forma de verificar esto para evitar que se llegue a la invalidación?

Soy un completo novato para la programación de iPhone y he pasado varias horas buscando en Google para tratar de resolver esto, pero no puedo entender lo que estoy haciendo mal. ¡Cualquier ayuda y sugerencia apreciada!

EDIT: Solo para aclarar, estoy usando esto para detener manualmente el temporizador antes de que se ejecute. Entiendo que si se agota, se invalida, por eso estoy usando la instrucción IF para verificar si ya se ha invalidado (pero no funciona). Entonces, creo que el temporizador ya se ha invalidado cuando ocurre este bloqueo, pero ¿cómo puedo verificar si ya está invalidado?

EDIT: Ok, marqué la respuesta correcta a continuación. No sé si realmente hay una razón por la cual el código pasa por las declaraciones IF cuando el temporizador no se retuvo y ya se ha invalidado, pero la respuesta es siempre usar RETAIN si va a usar el temporizador en una declaración IF .

Aquí hay información relacionada: ¿Hay alguna razón para retener un NSTimer programado si no necesita invalidarlo?

Respuestas a la pregunta(6)

Su respuesta a la pregunta