Как я могу отладить EXC_BAD_ACCESS из недействительного NSTimer - PullRequest
1 голос
/ 24 октября 2010

У меня есть повторяющийся NSTimer, который я аннулирую вручную за некоторое время до того, как освобождаю объект, которому принадлежит обратный вызов, который вызывается таймером. Я проверяю, что, когда я делаю недействительным таймер, обратный вызов больше не вызывается. Когда объект освобождается, через мгновение я получаю EXC_BAD_ACCESS. Сбой связан с тем, отменю ли я таймер или нет, т. Е. Если я его не аннулирую, то сбоев не будет.

Кто-нибудь знает, почему это может происходить? Я не понимаю, почему таймер пытался получить доступ к обратному вызову для объекта, который был удален, что, как кажется, происходит. Я в недоумении, как отладить это дальше. CallCack просто говорит:

#0  0x02f05c93 in objc_msgSend
#1  0x00000001 in ??
#2  0x02d255fa in CFRunLoopRunSpecific
#3  0x02d248a8 in CFRunLoopRunInMode
#4  0x037de89d in GSEventRunModal
#5  0x037de962 in GSEventRun
#6  0x00863372 in UIApplicationMain
#7  0x00002e40 in main at main.m:13

ОБНОВЛЕНИЕ: Я определил, что это не таймер, а утечка, возникшая из-за того, что мой родительский объект вызвал dealloc (таймер без аннулирования препятствовал вызову dealloc). Тем не менее, было бы полезно услышать совет о том, как отлаживать вещи, когда я ударился об стену с помощью стека вызовов, если это вообще возможно, поэтому я оставлю этот вопрос без ответа.

1 Ответ

4 голосов
/ 24 октября 2010

Когда вы аннулируете NSTimer, получатель отправляет release в параметры target и userInfo timerWithTimeInterval:target:selector:userInfo:repeats:. Возможно, вы ссылаетесь на эти объекты или у вас неправильное управление памятью с одним из этих объектов?

Один из способов отладки - использовать NSZombie .

...