【问题标题】:app runs fine with debug build, but crash on release build, what could be the possible reasons?应用程序在调试构建时运行良好,但在发布构建时崩溃,可能的原因是什么?
【发布时间】:2012-04-15 07:20:43
【问题描述】:

我有 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 方的一些源文件。

【问题讨论】:

  • 请提供更多提示,部署目标?您是否使用互联网连接?您的所有班级都使用 ARC 还是只使用其中的一部分?
  • 完成,请参阅上面的更新
  • 我认为最好在 sim 上使用僵尸工具来测试您的应用程序。您混合使用 ARC 和非 ARC 类的事实可能会导致使用委托或通知模式出现一些问题。很难理解为什么只在设备上而不是在 sim 上发生,但可能是由于两者之间的硬件差异。
  • 哦,区别在于发布版本和调试版本,而不是设备与模拟器。
  • 我明白了,但我认为无论如何它可能是这样的。如果您不发布整个崩溃日志,那么真的很难想象发生了什么。我正在考虑一个由连接回调异步调用的非空指针,所以是一个僵尸。仅在发布中发生的问题很难完全理解,但可能是由于不同的运行循环模式,您是否使用预处理器定义?像'#ifdef debug'等或类似的东西?您是否在多线程环境中使用网络连接?

标签: iphone ios release automatic-ref-counting


【解决方案1】:

每当这种情况发生在我身上时,似乎是因为发布版本更积极地清理弱引用。如果您在对弱属性进行任何强引用之前错误地将某些内容分配给弱属性(例如,如果您添加的子视图也将持有弱引用),这可能会在调试时工作并在发布时失败。例如(伪代码)

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

我已经看到这会导致发布版本中的错误访问崩溃,并且在调试时被忽视。

【讨论】:

  • 是的,这肯定会导致崩溃并且是一个错误。你永远不应该只有一个弱参考。
【解决方案2】:

我可能没有答案,但我会列出一些预感供您尝试:

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

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

【讨论】:

    【解决方案3】:

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

    在我们的例子中,发布目标没有看到 UIButton 上的类别。 ad-Hoc 构建运行良好,直到有人调用了该类别实现的方法。由于我们没有存储 Ad-Hoc 构建的存档,因此无法调试崩溃。 (经验教训)

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

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      相关资源
      最近更新 更多