我将NSZombieEnabled添加到我的可执行文件环境中,以便追踪我正在发布的对象。我现在发现的是,我的应用程序的一部分崩溃,之前从未崩溃,只有当NSZombieEnabled被切换时。我禁用它的那一刻,没有发生崩溃。
我需要对代码进行取证,但这可能意味着什么呢? NSZombieEnabled保持发送释放消息的对象。这可能会导致我崩溃,但应该吗?
另外,设置断点 - [_ NSZombie methodSignatureForSelector:]并没有真正给我一个精心设计的堆栈跟踪来知道发生了什么。
答案 0 :(得分:3)
如果您的应用程序与NSZombieEnabled崩溃,那么它很可能会因为禁用而崩溃,只是没有那么快而且不那么明显。
NSZombieEnabled保持发送释放消息的对象。这可能会导致我崩溃,但应该吗?
不,它不会导致您崩溃。导致崩溃的原因是向对象发送了过多的发布消息。这就是NSZombieEnabled的用途。
另外,设置断点 - [_ NSZombie methodSignatureForSelector:]并没有给我一个精心设计的堆栈跟踪来了解发生了什么。
尝试使用Instruments中的ObjectAlloc预设。
答案 1 :(得分:3)
在NSZombieEnabled下,对象没有完全释放,它们只是变成了僵尸。这意味着内存可以在运行时累积,特别是在您可能生成一堆NSStrings等的循环中。您的应用程序可能因内存使用而被杀死。
我错误地将其打开并忘记了它,然后花了最长的时间试图找出当我没有任何明显泄漏时我的内存使用量不断增加的原因。
答案 2 :(得分:1)
一种可能性:可能是您通过无效指针访问对象,并且幸运的是其他兼容对象恰好放在那里。在这种情况下,NSZombie会阻止对象被兼容的东西替换,而是将Zombie放在其位置。