Memory leaks 如何调试来自无效NSTimer的EXC_BAD_访问

Memory leaks 如何调试来自无效NSTimer的EXC_BAD_访问,memory-leaks,nstimer,Memory Leaks,Nstimer,我有一个重复的NSTimer,在解除锁定拥有计时器调用的回调的对象之前,我会手动使其无效。我验证当我使计时器无效时,回调不再被调用。当对象解除分配时,一瞬间我获得了EXC\u BAD\u访问权限。崩溃与我是否使计时器无效相关,即,如果我不使计时器无效,则不会发生崩溃 有人知道为什么会这样吗?我不明白为什么计时器会尝试访问dealloc'ed对象的回调,这似乎正在发生。我不知道如何进一步调试这个。调用堆栈只是说: #0 0x02f05c93 in objc_msgSend #1 0x00000

我有一个重复的NSTimer,在解除锁定拥有计时器调用的回调的对象之前,我会手动使其无效。我验证当我使计时器无效时,回调不再被调用。当对象解除分配时,一瞬间我获得了EXC\u BAD\u访问权限。崩溃与我是否使计时器无效相关,即,如果我不使计时器无效,则不会发生崩溃

有人知道为什么会这样吗?我不明白为什么计时器会尝试访问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调用)。如果可能的话,当我用callstack撞墙时,听听关于如何调试东西的建议仍然很有用,所以我将把这个问题留到后面。

当你使一个
NSTimer无效时,接收器向
timer的
target
userInfo
参数发送
release
,其时间间隔为:target:selector:userInfo:repeats:
。您是否可能引用了这些对象,或者其中一个对象的内存管理不正确


调试的一种方法是利用。

当您使
NSTimer
无效时,接收器向
目标
用户信息
参数发送一个
释放
时间间隔:目标:选择器:用户信息:重复:
。您是否可能引用了这些对象,或者其中一个对象的内存管理不正确


调试的一种方法是利用。

感谢您提供了指向NSZombie的指针。我发现问题毕竟不是NSTimer,而是当我正确地使它们全部无效时,我的对象能够被解除锁定(而不是被计时器保留),并且解除锁定本身由于另一个对象而导致崩溃。很高兴你能够纠正这种情况。如果遇到这种情况,请随意投票和/或接受答案以帮助他人。记住,僵尸是你的朋友…至少是僵尸!感谢您提供指向NSZombie的指针。我发现问题毕竟不是NSTimer,而是当我正确地使它们全部无效时,我的对象能够被解除锁定(而不是被计时器保留),并且解除锁定本身由于另一个对象而导致崩溃。很高兴你能够纠正这种情况。如果遇到这种情况,请随意投票和/或接受答案以帮助他人。记住,僵尸是你的朋友…至少是僵尸!