如何从无效的NSTimer调试EXC_BAD_ACCESS

时间:2010-10-24 01:12:29

标签: memory-leaks nstimer

我有一个重复的NSTimer,在我解除拥有定时器调用的回调的对象之前,我手动无效。我验证当我使计时器无效时,不再调用回调。当对象deallocs时,片刻之后我得到一个EXC_BAD_ACCESS。崩溃与我是否使计时器无效有关,即如果我没有使它失效,则没有崩溃。

有谁知道为什么会这样?我不明白为什么计时器会尝试访问dealloc'ed对象的回调,这就是似乎正在发生的事情。我不知道如何进一步调试。 callstack只是说:

#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调用)。当我使用callstack撞墙时,听到关于如何调试事情的建议仍然是有用的,如果可能的话,那么我会留下这个问题。

1 个答案:

答案 0 :(得分:4)

当您使NSTimer无效时,接收方会向release targetuserInfo timerWithTimeInterval:target:selector:userInfo:repeats:参数发送{{1}}。您是否可能引用这些对象或使用其中一个对象进行不正确的内存管理?

调试此方法的一种方法是使用NSZombie