Сбой iPhone - сообщение отправлено освобожденному экземпляру

Хорошо, вот ошибка, которую я получаю:

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

Вот код, вызывающий сбой:

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

И в других местах:

    NSTimer* waitingOpponentTimer;

А также:

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

Никакого другого случая ожиданияOpponentTimer НЕТ, кроме тех, что я показал выше. Действие waitOpponentTimeOut просто устанавливает несколько переменных и ничего не делает с таймерами или waitOpponentTimer.

Я попытался все следующие операторы IF, чтобы предотвратить достижение недействительного заявления:

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

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

Итак, мой вопрос: почему / как недействителен, вызывая ошибку, когда объект isValid и не ноль, а его retainCount больше нуля?

Есть ли другой способ проверить это, чтобы предотвратить недействительность?

Я полный новичок в программировании на iphone и потратил несколько часов, пытаясь понять это, но не могу понять, что я делаю неправильно. Любая помощь и предложения приветствуются!

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я использую это, чтобы вручную остановить таймер до его запуска. Я понимаю, что если он заканчивается, он делает себя недействительным, поэтому я использую оператор IF, чтобы проверить, был ли он уже признан недействительным (но он не работает). Поэтому я думаю, что таймер уже аннулировал себя, когда происходит этот сбой, но как я могу проверить, если он уже признан недействительным?

РЕДАКТИРОВАТЬ: Хорошо, я отметил правильный ответ ниже. Я не знаю, есть ли на самом деле причина, по которой код получает операторы IF, когда таймер не был сохранен и уже аннулировал себя, но ответ заключается в том, чтобы всегда использовать RETAIN, если вы собираетесь использовать таймер в операторе IF. ,

Вот связанная информация:Есть ли какая-либо причина для сохранения запланированного NSTimer, если вам не нужно его аннулировать?

Ответы на вопрос(3)

Ваш ответ на вопрос