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

有帮助吗?

解决方案

你有一个普通的旧崩溃。EXC_BAD_ACCESS 表示您的应用程序尝试访问无效的内存地址。虽然在非 GC 的 Objective-C 应用程序中最典型的原因是在释放后向对象发送消息(僵尸模式检测到这种情况),但这种特定的崩溃可能会以多种其他方式发生(如所示)。

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

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

不,实际上,它们确实出现在调试器中。一张图片抵得上1000个字。alt text
(来源: 星期五网)

其他提示

“EXC_BAD_ACCESS”不一定与僵尸实例相关。它可以链接到对未定义引用的访问,例如局部变量。

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

编辑:NSZombie 标志只会帮助您解决因使用取消分配的实例而触发的“EXC_BAD_ACCESS”。

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

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

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

例如,以下代码还将给出 EXC_BAD_ACCESS,该 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);

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

我也在问自己同样的事情。使用 xcode4,我启用了 NSZobmieEnabled = YES,以便在访问已释放的对象时停止,而不是因 EXC_BAD_ACCESS 崩溃 - 这非常有帮助。

当前的问题是:

“当我设置 NSZombieEnabled = Yes 时,没有任何内容写入控制台。我怎样才能解决这个问题...”。

简单直接。

我遇到了同样的问题。xcode 因调试器而停止,但控制台不产生任何消息。我希望得到以下内容:

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

是你 在堆栈溢出中搜索 EXC_BAD_ACCESS, ,你会发现很多人和你有同样的问题。绝大多数时候,你遇到这个问题时,都会遇到内存问题。如果您遵循所描述的协议 这里 或者 这里, ,并且您没有看到任何有关消息发送到控制台上已发布对象的报告,这可能有所不同。

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

由于我刚刚花了 20 分钟愉快地盯着这个 NSZombieEnabled 不起作用,我想我应该添加这将导致 EXC_BAD_ACCESS

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

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

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

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

最终,我注意到我收到了 EXC_BAD_ACCESS 错误和奇怪的行为,因为我 重命名 几个 xib 文件 一天前。我为 MainWindow.xib 文件选择了“视图控制器”对象并更正了 笔尖名称 财产。然后,一切都很顺利。

我认为并非每个 EXC_BAD_ACCESS 都能被 NSZombie Enabling 找到..
因为某些情况下我在使用僵尸时也没有得到结果..
我认为只有与释放对象的使用相关的EXC_BAD_ACCESS可以通过启用僵尸来查看。

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

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

谢谢

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top