【问题标题】:How do I set up NSZombieEnabled in Xcode 4?如何在 Xcode 4 中设置 NSZombieEnabled?
【发布时间】:2011-01-12 12:16:06
【问题描述】:

如何在 Xcode 4 中为我的可执行文件设置 NSZombieEnabledCFZombieLevel

【问题讨论】:

  • 你问的是 Xcode 4 吗?
  • 为什么默认情况下不启用这样的选项是我无法理解的......
  • 因为它基本上可以防止任何真正的内存释放,默认情况下启用这似乎不是一个好主意。
  • @Daniel Magnusson:这是适者生存的事情。通过使用 XCode 进行不友好但可行的开发,您将获得更好的开发人员。开个玩笑。
  • @DanielMagnusson 我认为这不是一个坏主意,AFAIK 的“僵尸”模式会将每个对象更改为特殊类型的 ob 对象,以便在收到消息时可以检测到。因此,启用“僵尸模式”将导致不会释放任何对象,因此您应该只在处理此类错误时使用它。

标签: objective-c xcode xcode4 nszombie


【解决方案1】:

在 Xcode 4.x 中按

R

(或点击Menubar>Product>Scheme>Edit Scheme

选择“诊断”选项卡并单击“启用僵尸对象”:

这会将释放的对象转换为 NSZombie 实例,在再次使用时会打印控制台警告。这是一种调试辅助工具,可以增加内存使用(没有真正释放对象)但改进了错误报告。

一个典型的情况是当你过度释放一个对象而你不知道是哪一个时:

  • 有僵尸:-[UITableView release]: message sent to deallocated instance
  • 没有僵尸:

当您归档应用程序以供 App Store 提交时,此 Xcode 设置将被忽略。在发布您的应用程序之前,您不需要触摸任何东西。

按住 R 与选择产品 > 运行同时按住 Alt 键相同。
单击“启用僵尸对象”复选框与在选项卡参数的“环境变量”部分手动添加“NSZombieEnabled = YES”相同。

【讨论】:

  • 谢谢 - 我想知道他们将这些选项隐藏在哪里。我现在意识到这与“编辑方案”菜单中的窗口相同。
  • 只是补充一点,如果选中了“使用运行操作的选项”框,则在“运行”屏幕中执行此操作也会将其设置为“测试”。如果您只想进行测试,则需要取消选中该框
  • 请注意这个选项出现在 Xcode 4.1 上(对吗?)
  • 在 XCode 5 中(当然还有 4 的更高版本 -- 4.3.x,也许更早),这是CMD-< (CMD-SHIFT-comma) 或Product -> Scheme -> Edit SCheme...
  • 我陷入了奇怪的 EXC_BAD_ACCESS 问题,甚至跳过了僵尸,如果你能指导我这个stackoverflow.com/questions/29210057/…
【解决方案2】:

Jano 的答案是找到它的最简单方法。另一种方法是单击方案下拉栏 -> 编辑方案 -> 参数选项卡,然后在 Environment Variables 列中添加 NSZombieEnabled 并在 value 列中添加 YES ...

【讨论】:

    【解决方案3】:

    我发现这个替代方案更方便:

    1. 点击“运行按钮下拉菜单”
    2. 从列表中选择Profile
    3. 应该打开“仪器”程序,您还可以选择Zombies
    4. 现在您可以与您的应用交互并尝试导致错误
    5. 一旦发生错误,您应该得到有关对象何时被释放并因此被释放的提示。

    一旦检测到僵尸,您就会得到一个简洁的“僵尸堆栈”,显示相关对象的分配时间以及保留或释放的位置:

    Event Type    RefCt     Responsible Caller
    Malloc            1     -[MyViewController loadData:]
    Retain            2     -[MyDataManager initWithBaseURL:]
    Release           1     -[MyDataManager initWithBaseURL:]
    Release           0     -[MyViewController loadData:]
    Zombie           -1     -[MyService prepareURLReuqest]
    

    与使用 Xcode 方案的诊断选项卡相比的优势

    1. 如果您忘记取消选中诊断选项卡中的选项,则不会从内存中释放任何对象。

    2. 您将获得更详细的堆栈,显示您的损坏对象是通过哪些方法分配/释放或保留的。

    【讨论】:

    • 我的 XCode 4 中缺少“Zombies”选项,为什么?
    • 确保您从主模板列表中选择iOS Simulator > All(您只能在模拟器中执行此操作)
    • 出于某种原因..如果我选择“僵尸”,它只会显示分配..知道为什么吗?
    • 这是最好的解决方案。帮了我很多:)
    【解决方案4】:

    在 Xcode 4.2 中

    • 项目名称/编辑方案/诊断/
    • 启用僵尸对象复选框
    • 大功告成

    【讨论】:

      【解决方案5】:

      在 Xcode 7 中开启

      或从Product 中选择Edit Scheme > Scheme 菜单

      Diagnostics 选项卡中选择Enable Zombie Objects

      作为替代方案,如果您更喜欢 .xcconfig 文件,您可以阅读这篇文章 https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/

      【讨论】:

        【解决方案6】:

        Cocoa 提供了一个很酷的功能,它极大地增强了您调试此类情况的能力。它是一个名为 NSZombieEnabled 的环境变量,观看此 video,它解释了在 Objective-C 中设置 NSZombieEnabled

        【讨论】:

          【解决方案7】:

          在 Xcode > 4.3 中:

          您单击方案下拉栏 -> 编辑方案 -> 参数选项卡,然后在 Environment Variables 列中添加 NSZombieEnabled 并在 value 列中添加 YES。

          祝你好运!!!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-11
            • 1970-01-01
            • 1970-01-01
            • 2011-08-28
            • 2011-08-26
            • 2011-10-22
            相关资源
            最近更新 更多