如何在 Xcode 4 中设置我的可执行文件NSZombieEnabled
?CFZombieLevel
7 回答
在 Xcode 4.x 中按
⌥</kbd>⌘</kbd>R
(或点击Menubar
> Product
> Scheme
> Edit Scheme
)
选择“诊断”选项卡并单击“启用僵尸对象”:
这会将释放的对象转换为 NSZombie 实例,在再次使用时会打印控制台警告。这是一种调试辅助工具,可以增加内存使用(没有真正释放对象),但可以改进错误报告。
一个典型的情况是当你过度释放一个对象并且你不知道是哪一个时:
- 与僵尸:
-[UITableView release]: message sent to deallocated instance
- 没有僵尸:
当您归档应用程序以供 App Store 提交时,此 Xcode 设置将被忽略。在发布您的应用程序之前,您不需要触摸任何东西。
紧迫⌥</kbd>⌘</kbd>R is the same as selecting Product > Run while keeping the Alt key pressed.
Clicking the "Enable Zombie Objects" checkbox is the same as manually adding "NSZombieEnabled = YES" in the section "Environment Variables" of the tab Arguments.
Jano 的答案是找到它的最简单方法。另一种方法是单击方案下拉栏 -> 编辑方案 -> 参数选项卡,然后在 Environment Variables 列中添加 NSZombieEnabled 并在 value 列中添加 YES ......
我发现这个替代方案更方便:
- 单击“运行按钮下拉菜单”
- 从列表中选择
Profile
- 程序“仪器”应该打开,您也可以选择
Zombies
- 现在您可以与您的应用程序交互并尝试导致错误
- 一旦发生错误,您应该得到有关对象何时被释放并因此被释放的提示。
一旦检测到僵尸,您就会得到一个简洁的“僵尸堆栈”,它会显示相关对象的分配时间以及保留或释放的位置:
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 方案的诊断选项卡相比的优势:
如果您忘记取消选中诊断选项卡中的选项,则不会从内存中释放任何对象。
你会得到一个更详细的堆栈,显示你的损坏对象是通过什么方法被分配/释放或保留的。
在 Xcode 4.2 中
- 项目名称/编辑方案/诊断/
- 启用僵尸对象复选框
- 你完成了
在 Xcode 7 中
⌘</kbd><
或Edit Scheme
从Product
>Scheme
菜单中选择
从选项卡Enable Zombie Objects
中选择Diagnostics
作为替代方案,如果您更喜欢.xcconfig
文件,您可以阅读这篇文章https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/
Cocoa 提供了一个很酷的功能,它极大地增强了您调试此类情况的能力。它是一个名为 NSZombieEnabled 的环境变量,观看此视频 ,了解如何在 Objective-C 中设置 NSZombieEnabled
在 Xcode > 4.3 中:
单击方案下拉栏 -> 编辑方案 -> 参数选项卡,然后在 Environment Variables 列中添加 NSZombieEnabled ,在 value 列中添加 YES 。
祝你好运 !!!