代码之家  ›  专栏  ›  技术社区  ›  Moshe

什么是NSZombie?

  •  87
  • Moshe  · 技术社区  · 14 年前

    我看到一些建议说 NSZombieEnabled true 调试时。什么是NSZombie?它是一个框架吗?一个场景?

    4 回复  |  直到 11 年前
        1
  •  183
  •   Adam Wright    8 年前

    它是一个内存调试辅助工具。特别是当你设定 NSZombieEnabled 然后当一个对象达到retain count 0时,它将自身变形为 NSZombie 实例。每当这样一个僵尸收到一条消息,它就会记录一个警告,而不是崩溃或以一种不可预知的方式行为。因此,您可以调试细微的过度释放/自动释放问题,而无需使用高级工具或在草堆搜索中费尽心思。

    当对象达到retain count 0时,通常会被视为“死”对象,这个名称是一个相当明显的作用。有了这个设置,它们就继续存在于一个奇怪的半衰期——既不生存,也不完全死亡。很像真正的僵尸,只不过它们吃的大脑更少。

        2
  •  94
  •   swiftBoy Vmanani    8 年前

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

    一个更好的僵尸检测方法,就是使用仪器-从XCode开始用“Run with Instrument”并选择“Allocations”。

    然后在开始后立即停止录制,按Allocations工具上的“i”按钮,并打开“启用引用计数”和“启用NSZombie检测”。现在再次点击仪器中的“录制”,您的应用程序将启动-如果任何僵尸对象被发送,则录制将停止,录制时间线中将弹出一个对话框-您可以单击该对话框查找对象被保留或释放的每个位置。

    编辑:之前的建议是针对XCode 3,下面是对XCode 4的补充:

    在XCode 4.2中 ,还有一种更容易利用僵尸检测的机制——僵尸仪器。使用“配置文件”而不是“运行”来启动应用程序,将出现一个仪器选择器。选择“僵尸”,应用程序将开始运行-做任何导致你的崩溃,一个对话框将弹出说“僵尸消息”。

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

        3
  •  31
  •   Alex Zavatone    10 年前

    我同意Kendall所说的,这非常有用,但我建议您还是使用环境变量,这样您就不会忘记它们已经启用。类似于Cocoa Dev上的(现在已经过期)链接,我把它放在这里是为了不错过它:

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

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

    推荐文章