Как я могу отладить EXC_BAD_ACCESS из недействительного NSTimer

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

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

#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). Тем не менее было бы полезно услышать совет о том, как отлаживать вещи, когда я упираюсь в стену со стеком вызовов, если это вообще возможно, поэтому я оставлю этот вопрос открытым.


person Joey    schedule 24.10.2010    source источник


Ответы (1)


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

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

person greg    schedule 24.10.2010
comment
Спасибо за указание на NSZombie. Я обнаружил, что проблема была не в NSTimer, а скорее в том факте, что когда я правильно объявляю их все недействительными, мой объект может быть освобожден (вместо того, чтобы сохраняться таймером) и сам Dealloc вызывал сбой из-за другого объекта. - person Joey; 24.10.2010
comment
Рад, что вы смогли исправить ситуацию. Не стесняйтесь голосовать и / или принимать ответ, чтобы помочь другим, если они столкнутся с этой ситуацией. Помните, что зомби — ваши друзья... по крайней мере, NSZombies! - person greg; 24.10.2010