什么是NSZombie?

103

我看到有建议在调试时设置NSZombieEnabledtrue。什么是NSZombie?它是一个框架吗?还是一个设置?


19
一个不死的NSObject - 当心! - vikingosegundo
6
一个不死的 NSObject。 - Alex Zavatone
4个回答

206

这是一种内存调试辅助工具。具体而言,当您设置 NSZombieEnabled 后,每当一个对象的保留计数达到0时,它不会被释放,而是变成一个 NSZombie 实例。每当这样的僵尸接收到消息时,它会记录警告信息而不是崩溃或表现出不可预测的行为。因此,您可以在没有高级工具或费力的查找的情况下调试微妙的过度释放/自动释放问题。

该名称明显是基于这样一个事实而玩笑:当对象的保留计数达到0时,它们通常被认为已经“死亡”。通过这个设置,它们继续以奇怪的半生不死状态存在 - 既不活着,也不完全死亡。就像真正的僵尸一样,只是它们吃掉的脑子要少得多。


66
调试完成后务必注意移除此设置,因为它会泄漏每一个对象。 - Justin
1
谢谢您提供的简单解释。请注意,Cocoa Dev Link已经无法使用了。点赞,因为简洁明了。 - CRDave

97

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对象的时刻列表。打开侧边栏,您可以转到每个条目,查看负责每次保留计数调整的代码的堆栈跟踪。


2
这是非常有用的建议。 - w.donahue
4
我更新了关于XCode 4的答案,因为它使在Instruments中进行Zombie检测变得更加容易。 - Kendall Helmstetter Gelner
不用担心,使用 XCode 5 和 6 基本上是一样的。 - Kendall Helmstetter Gelner
2
我可以确认,使用 XCode 7.2 也是可以的。 - Beat

32

我同意Kendall所说的,它非常有用,但我建议仍然使用环境变量,这样你不会忘记它们已经启用了。类似于Cocoa Dev上现在过期的链接,我把这个加入到我的设置中,以便我不会错过它:

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

它非常吸引我的注意力。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接