我有一个重复的NSTimer,我有一段时间手动失效,然后才解除拥有由定时器调用的回调的对象。我验证当我使计时器无效时,回调不再被调用。当对象释放时,稍后我会得到一个EXC_BAD_ACCESS。崩溃与我是否使计时器无效相关,即如果我不使其无效,则不会崩溃。我怎样才能从一个无效的NSTimer调试EXC_BAD_ACCESS
有谁知道为什么会发生这种情况?我不明白为什么计时器会尝试访问回收的dealloc'ed对象,这就是似乎正在发生。我不知道如何进一步调试。调用堆栈只是说:
#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的调用)。如果听到关于如何调试事件的建议,如果甚至有可能,那么我仍然会很有用,因为我打开了这个问题。
谢谢你指向NSZombie的指针。我发现这个问题毕竟不是NSTimer,而是一个事实,即当我*正确地*使它们全部失效时,我的对象能够被解除分配(而不是由定时器保留),而dealloc本身导致了由于另一个对象而崩溃。 – Joey 2010-10-24 04:22:58
很高兴你能纠正这种情况。如果他们遇到这种情况,请随时上传和/或接受帮助他人的答案。记住,僵尸是你的朋友......至少NSZombies! – greg 2010-10-24 12:20:11