Сбой 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, если вам не нужно его аннулировать?