2010-10-24 73 views
1

我有一个重复的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的调用)。如果听到关于如何调试事件的建议,如果甚至有可能,那么我仍然会很有用,因为我打开了这个问题。

回答

4

当一个无效NSTimer,接收器发送一个releasetimerWithTimeInterval:target:selector:userInfo:repeats:targetuserInfo参数。是否有可能引用了这些对象,或者是否有一些不正确的内存管理对象?

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

+1

谢谢你指向NSZombie的指针。我发现这个问题毕竟不是NSTimer,而是一个事实,即当我*正确地*使它们全部失效时,我的对象能够被解除分配(而不是由定时器保留),而dealloc本身导致了由于另一个对象而崩溃。 – Joey 2010-10-24 04:22:58

+0

很高兴你能纠正这种情况。如果他们遇到这种情况,请随时上传和/或接受帮助他人的答案。记住,僵尸是你的朋友......至少NSZombies! – greg 2010-10-24 12:20:11