将应用程序部署到设备时,程序将在几个周期后退出,并出现以下错误:
Program received signal: "EXC_BAD_ACCESS".
该程序在 iPhone 模拟器上运行没有任何问题,只要我一步一步执行说明,它也会调试和运行。一旦我让它再次运行,我就会击中EXC_BAD_ACCESS信号。
EXC_BAD_ACCESS
在这种特殊情况下,恰好是加速度计代码中的错误。它不会在模拟器中执行,这就是它没有抛出任何错误的原因。但是,它会在部署到设备后执行。
这个问题的大多数答案都是针对一般EXC_BAD_ACCESS错误的,所以我将把它作为一个全面的答案来解决可怕的 Bad Access 错误。
EXC_BAD_ACCESS通常由于非法内存访问而引发。您可以在下面的答案中找到更多信息。
你EXC_BAD_ACCESS之前有遇到过信号吗,你是怎么处理的?
根据您的描述,我怀疑最可能的解释是您的内存管理存在一些错误。您说您从事 iPhone 开发工作已经有几个星期了,但不是说您是否对 Objective C 有总体经验。如果您来自其他背景,则可能需要一段时间才能真正内化内存管理规则 - 除非您非常重视它。
请记住,您从分配函数(通常是静态分配方法,但还有其他一些方法)或复制方法中获得的任何东西,您也拥有内存,并且必须在完成后释放它。
但是,如果您从包括 工厂方法(例如)在内的任何其他东西中得到一些东西,[NSString stringWithFormat]那么您将拥有一个自动释放引用,这意味着它可以在将来的某个时间被其他代码释放 - 所以如果您需要,这一点至关重要将其保留在您保留它的直接功能之外。如果您不这样做,内存可能会在您使用它时保持分配状态,或者在您的模拟器测试期间被释放但巧合地仍然有效,但更有可能在设备上运行时被释放并显示为错误的访问错误。
[NSString stringWithFormat]
追踪这些事情的最好方法,也是一个好主意(即使没有明显的问题)是在 Instruments 工具中运行应用程序,尤其是使用 Leaks 选项。