什么是NSZombie?


Answers:


191

它是内存调试的辅助工具。具体来说,当您进行设置NSZombieEnabled时,只要对象达到保留计数0,而不是将其释放,它就会将自己变形为NSZombie实例。每当此类僵尸收到消息时,它都会记录警告,而不是以无法预测的方式崩溃或行为。这样,您可以调试细微的过度发布/自动发布问题,而无需使用高级工具或在干草堆搜索中费尽心思。

这个名称是一个相当明显的玩法,因为当对象达到保留计数0时,它们通常被视为“死”。在这种设置下,它们继续以奇怪的半衰期存在-既没有生命,也没有死亡。就像真正的僵尸一样,除了它们的大脑吃得更少。


61
完成调试后,请小心删除此设置,因为它实际上会泄漏每个对象。
贾斯汀2010年

1
感谢您的简单解释。通知您Cocoa Dev Link不再工作。简而言之+1。
CRDave 2014年

95

亚当在解释僵尸是什么方面做得很出色,但是使用环境变量并不是查找和跟踪这些僵尸的最佳方法。

更好地检测僵尸的方法是使用Instruments-从XCode以“ Run with Instrument”开始,然后选择“ Allocations”。

然后在开始录制后立即停止录制,按分配仪器上的“ i”按钮,然后打开“启用参考计数”和“启用NSZombie检测”。现在,再次在乐器中点击“记录”,您的应用将启动-如果发送了任何僵尸对象,消息记录将停止,并且在记录时间轴上将弹出一个对话框-您可以单击该按钮以查找对象所在的每个位置保留或释放。

编辑:先前的建议是针对XCode 3,这是针对XCode 4的补充:

在Xcode 4.2,有一个更容易机制,充分利用僵尸检测-僵尸仪器。使用“配置文件”代替“运行”来启动应用程序,仪器选择器将会出现。选择“僵尸”,该应用程序将开始运行-进行任何可能导致崩溃的操作,将弹出一个对话框,提示“僵尸消息已发送”。

从那里,单击对话框中的小箭头。这将列出创建,保留或释放僵尸对象的所有时间。拉起侧栏,您可以转到每个条目,在堆栈跟踪中查找负责保留计数中每个调整的代码。


2
这是非常有用的建议。
w.donahue 2011年

4
我更新了XCode 4的答案,因为它使在Instruments中进行僵尸检测变得更加容易。
Kendall Helmstetter Gelner 2011年

不是真的,应该工作几乎同样的用的XCode 5和6
肯德尔黑尔姆施泰特Gelner

2
我还可以使用XCode 7.2
击败

31

我同意Kendall所添加的内容,它非常有用,但是我建议您仍然进行环境变量操作,以免忘记启用它们。与Cocoa Dev中的(现已过期)链接类似,我放了它,所以我不会错过它:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

它很好地吸引了我的注意。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.