应用程序运行良好的调试版本,但发布版本崩溃,可能的原因是什么?

时间:2012-04-01 07:46:07

标签: iphone ios release automatic-ref-counting

我有Xcode 4.3.1,iOS 5.1,并且已启用ARC来构建我的应用。

现在,应用程序在调试版本中运行良好,但在发布版本上崩溃。差异的可能原因是什么?我完全依靠ARC进行资源管理。我查看了崩溃日志,它表明已经发布了引用的内存。使用ARC时,可能导致零售构建问题的常见缺陷是什么?

以下是我从崩溃日志中获得的内容

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x6f636552
Crashed Thread:  0

修改

该应用的部署目标是iOS 5.0。我确实使用互联网连接,当前的崩溃发生在“渲染”从Web服务返回的数据以便在UITableViewController上显示的时候。整个应用程序正在使用ARC,但我关闭ARC的第三方的一些源文件除外。

3 个答案:

答案 0 :(得分:4)

每当这种情况发生在我身上时,似乎是因为发布版本在清除弱引用方面更具侵略性。如果您错误地将某些内容分配给弱属性(例如,如果您要添加子视图,您也将保留弱引用),那么在您有任何强引用之前,这可以在调试时发挥作用并在发布时失败。例如(伪代码)

@property (weak) UILabel * label;
...
self.label = [[UILabel alloc] init]; 
[self.view addSubview:self.label];
...
self.label.text = @"hello";

我已经看到这会导致发布版本上的访问崩溃,并且在调试时不会被注意到。

答案 1 :(得分:0)

我可能没有答案,但我会列出一些让你尝试的事情:

  • 确保您没有将对象传递到方法中没有“手柄”的方法。例如,将处理程序类实例传递给需要委托的方法。该方法不会保留该实例,因此它甚至在调用该方法之前就会被释放。
  • 检查预编译器宏,确保它们对DEBUG和amp;都是安全的。 RELEASE构建。一个很好的例子是对发布版本中删除的宏有一个if语句,而if语句没有用大括号覆盖它。
  • 如果您依赖编译器定义来启用/禁用代码的某些部分(通过使用#if条件),请确保在构建配置中设置了所需的部分。

如果我能想到更多,我会尝试添加它们。

答案 2 :(得分:0)

您是否有不同的发布和调试目标?检查是否为发布目标正确引用了所有文件。

在我们的案例中,发布目标没有看到UIButton上的类别。 ad-Hoc构建很顺利,直到有人调用了该类别实现的方法。由于我们没有存储来自Ad-Hoc构建的存档,因此无法调试崩溃。 (吸取的教训)

不确定它是否在崩溃日志中列为EXC_BAD_ACCESS,但可以帮助某人识别其特定于发布的崩溃。