NSZombieEnabled不起作用

时间:2010-01-06 10:26:14

标签: iphone objective-c nszombie

当我设置NSZombieEnabled = Yes时,没有任何内容写入控制台。我怎样才能解决这个问题?或者你可以告诉我EXC_BAD_ACCESS的任何其他工具吗?

8 个答案:

答案 0 :(得分:30)

你有一个普通的老崩溃。 EXC_BAD_ACCESS表示您的应用程序试图访问无效的内存地址。虽然在非GC的objective-c应用程序中最常见的原因是在解除分配后发送一个对象,这是Zombie Mode检测到的,但这种特殊的崩溃可以通过许多其他方式发生(如图所示)。

由于您的应用程序崩溃,您应该有一个回溯。您需要在此发布该回溯,以便我们任何人能够进一步为您提供帮助。

正如Brad所说,在启用调试的情况下运行您的应用程序。在Xcode中,您将在“运行”菜单下找到“运行/调试”菜单项。使用那个。当您的应用程序崩溃时,您应该在调试器窗口的左上角看到堆栈跟踪。

不,实际上,它们确实出现在调试器中。一张图片值1000字。 alt text
(来源:friday.com

答案 1 :(得分:10)

“EXC_BAD_ACCESS”不一定与僵尸实例有关。它可以链接访问未定义的引用,如本地变量。

NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error

修改 NSZombie标志只会帮助您解决使用解除分配的实例触发的“EXC_BAD_ACCESS”。

为了解决这些错误,您必须使用崩溃回溯来查明错误的位置。然后,返回到您的代码并检查每个分配和分配。

答案 2 :(得分:6)

还要确保在使用之前将所有指针初始化为nil!

如果使用指针而不将其初始化为nil或任何其他对象,则可能最终会访问不属于您的内存。

例如,下面的代码也会给出一个EXC_BAD_ACCESS,它不能使用最后一行引起的NSZombieEnabled标志进行跟踪。

RecordingLocation* closest;

//find the closest recording location
for (...)
{
    //try to find the closest object...
    //suppose we don't find anything so closest is never set.
}

if (closest!=nil)
    NSLog(@"Closest: %f,%f",closest.x,closest.y);

答案 3 :(得分:6)

我不明白这个问题的答案是如何真正回答这个问题的。

我问自己同样的事情。使用xcode4我已经启用了NSZobmieEnabled = YES,当我访问已发布的对象时停止,而不是使用EXC_BAD_ACCESS崩溃 - 这非常有帮助。

手头的问题是:

“当我设置NSZombieEnabled =是没有任何内容写入控制台。我该如何解决这个问题......”。

简单直接。

我遇到了同样的问题。 xcode与调试器停止,但控制台不会产生任何消息。我希望有类似的东西:

“发送给已解除分配的实例的消息......”。

答案 4 :(得分:4)

你是search Stack Overflow for EXC_BAD_ACCESS,你会发现很多人遇到同样的问题。绝大多数时候,你遇到了内存问题。如果您遵循描述的herehere协议,并且您没有看到任何报告将消息发送到控制台上的已发布对象,则可能会有所不同。

您是否尝试在调试器中启动应用程序(运行|调试 - 断点开启)?一旦你点击EXC_BAD_ACCESS,调试器应该停止。如果查看调试器(Run | Debugger)中显示的回溯,它可能会显示错误发生的位置。

答案 5 :(得分:1)

因为我刚刚花了20分钟,因为NSZombieEnabled无法正常工作,我想我会添加这个会导致EXC_BAD_ACCESS

NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];

请注意第二个参数上缺少的“@”。我没有: - )

答案 6 :(得分:1)

我对EXC_BAD_ACCESS有不同的体验,所以我想分享一下。

如问题中所述,即使选中了NSZombieEnabled,也没有任何内容写入控制台。在模拟器中经过几个小时的挣扎之后,我决定将它安装到设备上。我通过设备调试得到的错误消息更有帮助。

最后,我注意到我收到了EXC_BAD_ACCESS错误和奇怪的行为,因为我前一天重命名了几个 xib文件。我为MainWindow.xib文件选择了“View Controller”对象并更正了 NIB Name 属性。然后,一切顺利。

答案 7 :(得分:0)

我认为NSZombie启用并非每个EXC_BAD_ACCESS都可以启用..
因为有些情况我在使用僵尸时也没有得到结果。
我认为只有与使用已发布对象相关的EXC_BAD_ACCESS才能通过启用僵尸进行查看。

我在使用僵尸时注意到的另一个问题是:有时它也会导致调试崩溃。我抓到一起案件,显示:
*** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
它仅在启用NSZombie时发生。

我正在做的是,On - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
我发布了当前的“MagazineWebview”对象,并在另一个“MagazineWebview”对象中加载了给定的[request URL]。为了实现我的一些功能......

感谢