什么是NSZombie?

Mos*_*she 93 iphone objective-c nszombie ios

我已经看到建议在调试时设置NSZombieEnabledtrue.什么是NSZombie?它是一个框架吗?一个设置?

Ada*_*ght 182

这是一个内存调试辅助工具.具体来说,当你设置NSZombieEnabled一个对象到达保留计数0时,而不是被解除分配时,它会将自身变形为一个NSZombie实例.每当这样的僵尸收到消息时,它就会记录警告,而不是以不可预测的方式崩溃或表现.因此,您可以调试细微的过度释放/自动释放问题,而无需在干草堆搜索中使用高级工具或精心设计的针.

这个名字是一个相当明显的戏剧,因为当物体达到保留计数0时通常被认为是"死".通过这种设置,它们继续存在于一个奇怪的半衰期中 - 既不活着也不死.就像真正的僵尸一样,除了他们吃的脑子少了.

  • 完成调试后,请小心删除此设置,因为它实际上会泄漏每个对象. (59认同)

Ken*_*ner 94

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

一种更好的僵尸检测方法,就是使用仪器 - 从XCode开始,用"Run with Instrument"选择"Allocations".

然后在开始后立即停止录制,按下Allocations乐器上的"i"按钮,然后打开"启用参考计数"和"启用NSZombie Detection".现在再次在仪器中点击Record,您的应用程序将启动 - 如果发送了任何僵尸对象,则记录将停止,并且会在记录时间线中弹出一个对话框 - 您可以单击该对话框查找对象所在的每个位置保留或释放.

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

在XCode 4.2中,有一种更简单的机制可以使用Zombie检测 - 僵尸仪器.而不是"运行"来启动应用程序,使用"配置文件",仪器选择器将出现.选择"Zombie",应用程序将开始运行 - 做任何导致崩溃的事情,会弹出一个对话框,说"Zombie Messaged".

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

  • 我更新了XCode 4的答案,因为它使得在仪器中进行Zombie检测变得更加容易. (4认同)
  • 这是非常有用的建议. (2认同)
  • 我希望我可以多次投票! (2认同)
  • 我也可以用**XCode 7.2确认** (2认同)

Mat*_*ick 31

我同意肯德尔的补充,它非常有用,但我建议你仍然在做环境变量,所以你不要忘记它们已被启用.类似于Cocoa Dev的(现已过期)链接,我把它放在这里,所以我不会错过它:

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

它非常吸引我的注意力.

  • 即使是客户端也可能收到诡异的错误消息!:-) (6认同)