当将应用程序部署到设备时,程序将在几个周期后退出,并出现以下错误:

Program received signal: "EXC_BAD_ACCESS".

程序在iPhone模拟器上运行没有任何问题,只要我一次执行一个指令,它也会调试和运行。一旦我让它再次运行,我将击中EXC_BAD_ACCESS信号。

在这种特殊情况下,它恰好是加速度计代码中的一个错误。它不会在模拟器中执行,这就是它不会抛出任何错误的原因。但是,它将在部署到设备后执行。

这个问题的大多数答案都处理一般的EXC_BAD_ACCESS错误,因此我将保留这个选项,作为可怕的坏访问错误的统称。

EXC_BAD_ACCESS通常是非法内存访问的结果。你可以在下面的答案中找到更多信息。

您以前遇到过EXC_BAD_ACCESS信号吗?您是如何处理它的?


当前回答

不是一个完整的答案,但我收到的一个具体情况是,当我试图访问一个“死亡”的对象时,因为我试图使用自动释放:

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

因此,例如,我实际上是把这个作为一个对象传递给“通知”(注册为一个侦听器,观察者,无论你喜欢的习语),但它已经死亡一旦通知被发送,我将得到EXC_BAD_ACCESS。将其更改为[[MyNetObject alloc] init]并在适当的时候释放它解决了错误。

另一个可能发生这种情况的原因是,例如,如果你传入一个对象并试图存储它:

myObjectDefinedInHeader = aParameterObjectPassedIn;

稍后,当试图访问myObjectDefinedInHeader时,您可能会遇到麻烦。使用:

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

也许正是你所需要的。当然,这些只是我遇到的几个例子,还有其他原因,但这些可能是难以捉摸的,所以我提到了它们。好运!

其他回答

苹果开发者计划的任何参与者都可以观看2010年的WWDC视频。 有一个很棒的视频:“会话311 -用仪器进行高级内存分析”,展示了在仪器中使用僵尸并调试其他内存问题的一些例子。

要获得登录页面的链接,请单击这里。

EXC_BAD_ACCESS信号是向系统调用传递无效指针的结果。我今天早些时候在OS X上用一个测试程序得到了一个-我传递了一个未初始化的变量到pthread_join(),这是由于早期的拼写错误。

我不太熟悉iPhone开发,但是你应该仔细检查你传递给系统调用的所有缓冲指针。一直提高编译器的警告级别(使用gcc时,使用-Wall和-Wextra选项)。在模拟器/调试器上启用尽可能多的诊断。

我得到它,因为我没有使用[self performSegueWithIdentifier:sender:]和-(void) prepareForSegue:(UIstoryboardSegue *)正确

不是一个完整的答案,但我收到的一个具体情况是,当我试图访问一个“死亡”的对象时,因为我试图使用自动释放:

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

因此,例如,我实际上是把这个作为一个对象传递给“通知”(注册为一个侦听器,观察者,无论你喜欢的习语),但它已经死亡一旦通知被发送,我将得到EXC_BAD_ACCESS。将其更改为[[MyNetObject alloc] init]并在适当的时候释放它解决了错误。

另一个可能发生这种情况的原因是,例如,如果你传入一个对象并试图存储它:

myObjectDefinedInHeader = aParameterObjectPassedIn;

稍后,当试图访问myObjectDefinedInHeader时,您可能会遇到麻烦。使用:

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

也许正是你所需要的。当然,这些只是我遇到的几个例子,还有其他原因,但这些可能是难以捉摸的,所以我提到了它们。好运!

当你有无限递归的时候,我认为你也会有这个错误。这是我的案子。