什么是NSZombie?

我见过build议说在debugging时将NSZombieEnabled设置为true 。 什么是NSZombie? 这是一个框架吗? 一个设置?

这是一个内存debugging帮助。 特别是,当你设置NSZombieEnabled那么每当一个对象达到保留计数0,而不是被解除分配它变身为一个NSZombie实例。 每当这样一个僵尸收到一条消息,它会logging一个警告,而不是崩溃或行为不可预知的方式。 因此,您可以debugging微妙的过度释放/自动释放问题,无需高级工具或艰苦的大海捞针search。

这个名字是一个相当明显的玩法,当物体达到保留数0时,物体通常被认为是“死的”。在这种情况下,它们继续存在一个奇怪的半衰期 – 既不活着,也不完全死亡。 就像真正的僵尸一样,除了他们吃的脑子比较less。

亚当在解释僵尸是什么时做得很好,但是使用环境variables并不是寻找和追踪这些僵尸的最好方法。

一个更好的方法来僵尸检测,只是使用仪器 – 从XCode开始“与仪器运行”,并select“分配”。

然后立即停止录音,按下Allocations乐器上的“i”button,打开“启用参考计数”和“启用NSZombie检测”。 现在再次打开仪器中的logging,你的应用程序将启动 – 如果有僵尸对象发送消息录制将停止,并会popup一个对话框的录制时间表 – 你可以点击,find每个地方的对象是保留或释放。

编辑:以前的build议是XCode 3,这里是XCode 4的补充:

在XCode 4.2中 ,使用僵尸检测 – 僵尸工具有一个更简单的机制。 而不是“运行”来启动应用程序,使用“configuration文件”和仪器select器会出现。 select“僵尸”,应用程序将开始运行 – 做任何导致你的崩溃,一个对话框将popup说“僵尸消息”。

从那里,点击对话框中的小箭头。 这将列出所有僵尸对象创build,保留或释放的时间。 拉起边栏,你可以去每个条目,查看堆栈跟踪代码,这是在保留计数的每个调整负责。

我同意Kendall补充说,这是非常有用的,但我会build议仍然在做环境variables,所以你不要忘记他们启用。 类似于Cocoa Dev的(现在过期的)链接,我把它放在这里,所以我不要错过它:

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

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