【问题标题】:NSZombie crashing app when enabled on the iPhoneNSZombie 在 iPhone 上启用时崩溃的应用程序
【发布时间】:2009-07-14 16:10:12
【问题描述】:
我将 NSZombieEnabled 添加到我的可执行文件的环境中,以追踪我过度释放的对象。我现在发现的是,我的应用程序的一部分正在崩溃,以前从未崩溃过,只有当 NSZombieEnabled 被打开时。在我禁用它的那一刻,不会发生崩溃。
我需要对我的代码进行取证,但这可能意味着什么? NSZombieEnabled 将正在发送释放消息的对象保留在周围。这可能会导致我崩溃,但应该这样吗?
此外,设置断点 -[_NSZombie methodSignatureForSelector:] 并没有真正给我足够详细的堆栈跟踪来了解发生了什么。
【问题讨论】:
标签:
iphone
cocoa
debugging
【解决方案1】:
如果您的应用在启用 NSZombieEnabled 时崩溃,那么它很有可能在禁用它的情况下崩溃,只是不会那么快也不会那么明显。
NSZombieEnabled 保留正在发送释放消息的对象。这可能会导致我崩溃,但应该这样吗?
不,它不会导致您崩溃。导致您崩溃的原因是向对象发送了太多的发布消息。这就是 NSZombieEnabled 的用途。
另外,设置断点 -[_NSZombie methodSignatureForSelector:] 并没有给我足够详细的堆栈跟踪来了解发生了什么。
尝试使用 Instruments 中的 ObjectAlloc 预设。
【解决方案2】:
在 NSZombieEnabled 下,对象并没有完全释放,它们只是变成了僵尸。这意味着内存会在您运行时累积,尤其是在您可能生成一堆 NSString 等的循环中。您的应用程序可能由于内存使用而被终止。
我犯了一个错误,打开它并忘记了它,然后花了最长的时间试图弄清楚为什么我的内存使用量一直在增加,而我没有任何明显的泄漏。
【解决方案3】:
一种可能性:可能是您正在通过无效指针访问一个对象,并且幸运地碰巧将另一个兼容对象放置在那里。在这种情况下,NSZombie 会阻止对象被兼容的东西替换,而是将 Zombie 放在它的位置。