我有一个程序,在Debug配置下在设备上运行良好,但在Release版本下失败。有没有人有这种经验,如何解决?
谢谢
我有一个程序,在Debug配置下在设备上运行良好,但在Release版本下失败。有没有人有这种经验,如何解决?
谢谢
我也遇到了同样的问题 - 应用程序在模拟器和Debug模式下运行良好,但在Release模式下无法正常工作(可以安装,但只显示启动画面)
我一直在StackOverflow上看到说这是内存管理问题的答案,但对我来说这毫无意义,因为调试版本在我的iPhone 4S上加载时完全正常。我还检查了Build Settings以查看两种模式之间的区别,并跳过了最后有影响的一个差异 - 编译器优化。
在Build Settings中-> Apple LLVM编译器3.1代码生成 -> 优化级别下,将Release设置从默认值 Fastest,Smallest [-Os] 更改为 None[-O0] 。解决了我的问题。
在这篇博客文章中找到了这个解决方案: http://www.mindjuice.net/2011/11/30/how-to-fix-an-app-that-crashes-in-release-but-not-debug/ 。
虽然 Apple文档有所帮助,但并没有解释为什么做相反的事情会修复问题:
任何类型的代码优化都会导致更慢的构建时间,因为涉及到优化过程中的额外工作。如果您的代码在开发周期内正在变化,那么您不希望启用优化。当您接近开发周期的结束时,发布构建配置可以为您提供完成产品的大小指示,因此最快,最小选项是适当的。
None:编译器不尝试优化代码。在开发期间专注于解决逻辑错误并需要快速编译时,请使用此选项。不要将此选项用于发布可执行文件。
最快、最小:编译器执行所有不会增加代码大小的优化。这是发布代码的首选选项,因为它可以使可执行文件的内存占用更小。
"失败"是什么意思?崩溃?挂起?因内存使用而被抛弃?故障的症状是什么?有回溯吗?您的代码中是否有任何在调试和发布版本中表现不同的行为?有任何类似于#ifdef DEBUG
的花招吗?带有副作用的asserts
?您是否更改了编译器设置?有C++?汇编语言吗?
我在评论中看到了一点线索;变量的非法访问。很可能,这是由于优化器在发布版本中比调试版本更快地重新使用堆栈插槽引起的。通常,这归结为过度释放问题。
即使在发布版本中构建,您仍然可以打开僵尸检测。
此外,您是否执行了构建和分析并修复了它指出的任何问题?