如何在Xcode 4中设置NSZombieEnabled?


456

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


1
您是否在询问Xcode 4?
Jehiah 2011年

8
为什么默认情况下不启用此类选项,这超出了我的范围……
Daniel Magnusson

26
因为它基本上可以防止任何真正的内存释放,所以默认情况下启用它似乎不是一个好主意。

14
@丹尼尔·马格努森(Daniel Magnusson):这是适者生存的事情。通过使使用XCode进行的开发不友好但可行,您将获得更好的开发人员。开玩笑。
丹·罗森斯塔克2011年

3
@DanielMagnusson我认为这不是一个坏主意,AFAIK的“僵尸”模式会将每个对象更改为一种特殊的ob对象,以便它在发送消息时可以进行检测。因此,启用“僵尸模式”将导致不会释放任何对象,因此您只应在解决此类错误时才使用它。
Besi 2012年

Answers:


753

在Xcode 4.x中按

R

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

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

单击“启用僵尸对象”

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

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

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

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

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


27
谢谢-我想知道他们在哪里隐藏了这些选项。我现在意识到这是与“编辑计划”菜单中的窗口相同的窗口。
emp

1
只是要添加此内容,如果选中了“使用运行操作的选项”框,则在“运行”屏幕中将其设置为“测试”。如果你想这样做只是测试,该框必须选中
卡梅伦

1
另请注意,此选项出现在Xcode 4.1上(对吗?)
phi

2
在XCode 5中(肯定是4 – 4.3.x的更高版本,也许是更早),这是CMD-<CMD-SHIFT-comma)或Product -> Scheme -> Edit SCheme...
Olie

1
我陷入了一个奇怪的EXC_BAD_ACCESS问题中,即使是僵尸也被跳过了,如果您能指导我参加这个stackoverflow.com/questions/29210057/
Anoop Vaidya

70

Jano的答案是找到它的最简单方法。另一种方法是,单击方案下拉栏->编辑方案->参数选项卡,然后在“环境变量”列中添加NSZombieEnabled,在值列中添加“是”。


57

我发现此替代方法更方便:

  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 Schemes的诊断选项卡相比的优势

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

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


1
XCode 4中缺少“僵尸”选项,为什么?
李富民

4
确保您iOS Simulator > All从主模板列表中进行选择(您只能在模拟器中执行此操作)
Besi 2012年

由于某种原因..如果我选择“僵尸”,它只是显示分配..任何想法为什么?
2013年

这是最好的解决方案。帮了我很多:)
米哈尔Miszczyszyn



1

可可提供了一项很酷的功能,可以大大增强您调试此类情况的能力。这是一个称为NSZombieEnabled的环境变量,请观看此视频 ,其中介绍了在Objective-C中设置NSZombieEnabled的过程。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.