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