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

Program received signal: "EXC_BAD_ACCESS".

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

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

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

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

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


当前回答

在12 Pro Max上尝试分配140000xScreen高度的ScrollView空间时EXC_BAD_ACCESS错误。它的分配很好,直到达到140,000像素的宽度。;)

其他回答

我如何处理EXC_BAD_ACCESS

有时候我觉得当一个EXC_BAD_ACCESS错误被抛出时,xcode会在主代码中显示错误。m类没有提供崩溃发生的额外信息(有时)。

在这种情况下,我们可以在Xcode中设置一个异常断点,这样当异常被捕获时,就会设置一个断点,并直接通知用户崩溃已经发生在那一行

再补充一种可能发生这种情况的情况:

我有密码:

NSMutableString *string;
[string   appendWithFormat:@"foo"];

显然,我忘记了为字符串分配内存:

NSMutableString *string = [[NSMutableString alloc] init];
[string   appendWithFormat:@"foo"];

解决问题。

调用NSAssert()来验证方法参数对于跟踪和避免传递nil也非常方便。

从你的描述中,我怀疑最有可能的解释是你在内存管理中出现了一些错误。你说你已经在iPhone开发上工作了几个星期,但没有说你是否对Objective C有一般的经验。如果你来自其他背景,在你真正内化内存管理规则之前可能需要一段时间——除非你把它说得很重要。

记住,你从分配函数(通常是静态的alloc方法,但也有一些其他方法)或复制方法获得的任何东西,你也拥有内存,当你完成时必须释放它。

But if you get something back from just about anything else including factory methods (e.g. [NSString stringWithFormat]) then you'll have an autorelease reference, which means it could be released at some time in the future by other code - so it is vital that if you need to keep it around beyond the immediate function that you retain it. If you don't, the memory may remain allocated while you are using it, or be released but coincidentally still valid, during your emulator testing, but is more likely to be released and show up as bad access errors when running on the device.

追踪这些东西的最好方法,也是一个好主意(即使没有明显的问题)是在Instruments工具中运行应用程序,特别是带有Leaks选项。

在过去的四个小时里,我一直在调试和重构代码来解决这个错误。上面的一篇文章让我发现了这个问题:

属性:

startPoint = [[DataPoint alloc] init] ;
startPoint= [DataPointList objectAtIndex: 0];
x = startPoint.x - 10; // EXC_BAD_ACCESS

房地产后:

startPoint = [[DataPoint alloc] init] ;
startPoint = [[DataPointList objectAtIndex: 0] retain];

再见EXC_BAD_ACCESS

非常感谢你的回答。我一整天都在为这个问题发愁。你太棒了!