我看到有建议在调试时设置NSZombieEnabled
为true
。什么是NSZombie?它是一个框架吗?还是一个设置?
我看到有建议在调试时设置NSZombieEnabled
为true
。什么是NSZombie?它是一个框架吗?还是一个设置?
这是一种内存调试辅助工具。具体而言,当您设置 NSZombieEnabled
后,每当一个对象的保留计数达到0时,它不会被释放,而是变成一个 NSZombie
实例。每当这样的僵尸接收到消息时,它会记录警告信息而不是崩溃或表现出不可预测的行为。因此,您可以在没有高级工具或费力的查找的情况下调试微妙的过度释放/自动释放问题。
该名称明显是基于这样一个事实而玩笑:当对象的保留计数达到0时,它们通常被认为已经“死亡”。通过这个设置,它们继续以奇怪的半生不死状态存在 - 既不活着,也不完全死亡。就像真正的僵尸一样,只是它们吃掉的脑子要少得多。
Adam很好地解释了什么是Zombie对象,但使用环境变量不是找到和跟踪这些对象的最佳方式。
更好的检测Zombie对象的方法是使用Instruments-从XCode开始,选择“Allocations”并使用“Instrument运行”。
然后在启动录制后立即停止录制,在“Allocations”工具上按“i”按钮,打开“Enable Reference Counts”和“Enable NSZombie Detection”。现在再次在工具中点击记录按钮,您的应用程序将启动-如果任何Zombie对象发送消息,则记录将停止,并且会弹出一个对话框显示在记录时间轴上-您可以单击该对话框以找到每个对象被保留或释放的位置。
编辑:之前的建议适用于XCode 3,以下是XCode 4的附加说明:
在XCode 4.2中,有一种更简单的机制可用于使用Zombie detection- Zombie Instrument。而非使用“Run”来启动应用程序,使用“Profile”,将会弹出一个工具选择器。选择“Zombie”,应用程序将开始运行-进行导致崩溃的任何操作,将弹出一个对话框显示“Zombie Messaged”。
从那里,点击对话框中的小箭头,这将带您进入所有创建、保留或释放Zombie对象的时刻列表。打开侧边栏,您可以转到每个条目,查看负责每次保留计数调整的代码的堆栈跟踪。
我同意Kendall所说的,它非常有用,但我建议仍然使用环境变量,这样你不会忘记它们已经启用了。类似于Cocoa Dev上现在过期的链接,我把这个加入到我的设置中,以便我不会错过它:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
它非常吸引我的注意力。