【问题标题】:How can I debug an EXC_BAD_ACCESS from an invalidated NSTimer如何从无效的 NSTimer 调试 EXC_BAD_ACCESS
【发布时间】:2010-10-24 01:12:28
【问题描述】:

我有一个重复的 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 调用)。当我用调用堆栈碰壁时,听到有关如何调试事物的建议仍然很有用,如果可能的话,所以我会留下这个问题。

【问题讨论】:

    标签: memory-leaks nstimer


    【解决方案1】:

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

    一种调试方法是使用NSZombie

    【讨论】:

    • 感谢您对 NSZombie 的指点。我发现问题根本不是 NSTimer,而是当我正确使它们全部失效时,我的对象能够被释放(而不是由计时器保留)并且由于另一个对象,dealloc 本身导致了崩溃。
    • 很高兴您能够纠正这种情况。如果遇到这种情况,请随意投票和/或接受答案以帮助他人。记住,僵尸是你的朋友……至少是 NSZombies!
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多