我已经看到建议在调试时设置NSZombieEnabled
为的建议true
。什么是NSZombie?是框架吗?设置吗?
我已经看到建议在调试时设置NSZombieEnabled
为的建议true
。什么是NSZombie?是框架吗?设置吗?
Answers:
它是内存调试的辅助工具。具体来说,当您进行设置NSZombieEnabled
时,只要对象达到保留计数0,而不是将其释放,它就会将自己变形为NSZombie
实例。每当此类僵尸收到消息时,它都会记录警告,而不是以无法预测的方式崩溃或行为。这样,您可以调试细微的过度发布/自动发布问题,而无需使用高级工具或在干草堆搜索中费尽心思。
这个名称是一个相当明显的玩法,因为当对象达到保留计数0时,它们通常被视为“死”。在这种设置下,它们继续以奇怪的半衰期存在-既没有生命,也没有死亡。就像真正的僵尸一样,除了它们的大脑吃得更少。
亚当在解释僵尸是什么方面做得很出色,但是使用环境变量并不是查找和跟踪这些僵尸的最佳方法。
更好地检测僵尸的方法是使用Instruments-从XCode以“ Run with Instrument”开始,然后选择“ Allocations”。
然后在开始录制后立即停止录制,按分配仪器上的“ i”按钮,然后打开“启用参考计数”和“启用NSZombie检测”。现在,再次在乐器中点击“记录”,您的应用将启动-如果发送了任何僵尸对象,消息记录将停止,并且在记录时间轴上将弹出一个对话框-您可以单击该按钮以查找对象所在的每个位置保留或释放。
编辑:先前的建议是针对XCode 3,这是针对XCode 4的补充:
在Xcode 4.2,有一个更容易机制,充分利用僵尸检测-僵尸仪器。使用“配置文件”代替“运行”来启动应用程序,仪器选择器将会出现。选择“僵尸”,该应用程序将开始运行-进行任何可能导致崩溃的操作,将弹出一个对话框,提示“僵尸消息已发送”。
从那里,单击对话框中的小箭头。这将列出创建,保留或释放僵尸对象的所有时间。拉起侧栏,您可以转到每个条目,在堆栈跟踪中查找负责保留计数中每个调整的代码。
我同意Kendall所添加的内容,它非常有用,但是我建议您仍然进行环境变量操作,以免忘记启用它们。与Cocoa Dev中的(现已过期)链接类似,我放了它,所以我不会错过它:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
它很好地吸引了我的注意。