应用程序在发布版本中崩溃,但在调试中没有崩溃

Ben*_*Ben 29 objective-c crash-reports ios testflight swift

正如我在标题中所说,我正在为iPhone编写一个应用程序,它在调试模式下运行完美,但当我将其构建为发布并通过TestFlight安装时,它会崩溃.由于崩溃日志,它可能必须使用以下行:

let path = NSBundle.mainBundle().pathForResource("PrinterList", ofType: "plist")
if path != nil {
    let printerDic = NSDictionary(contentsOfFile: path!)
    let printerList = NSArray(array: printerDic.allKeys)
    printerNames = printerList as [String]
}
Run Code Online (Sandbox Code Playgroud)

我使用Brother的框架在没有AirPrint的情况下进行打印,但我认为这不是问题,因为应用程序在使用框架之前崩溃了.它只在我执行这些行的ViewController中崩溃.我也只需要在这个ViewController中使用框架.

Mat*_*son 37

应用程序可能在发布模式下崩溃但在调试模式下不会崩溃的原因有很多(例如,内存分配差异显示两个构建中实际存在的错误.)即使使用非错误,它们也可能需要大量工作才能跟踪beta编译器/语言.

你说如果你像我建议的那样做,并且在关闭优化的情况下构建发布版本,问题就会消失.鉴于Swift编译器仍然处于测试阶段并且肯定仍然存在偶然的问题 - 我已经看到编译器在构建优化版本时会崩溃 - 这实际上可能是一个优化器错误.

因此,现在,我推迟调查.在我们获得编译器的完整发行版之前,不进行优化发布.然后,重新启用优化并查看是否仍有问题.如果你这样做,那就是开始消耗能量的时候,试图找出它是编译器错误还是你自己代码中的错误.


Ant*_*ine 8

我遇到了同样的问题.我终于通过开启来修复它whole module optimization.结合正确的访问控制实现, 这应该可以解决您的崩溃问题.

根据Apple的整个模块优化:

使用整个模块优化来推断内部声明的最终结果.具有内部访问权限的声明(如果未声明任何内容,则为默认声明)仅在声明它们的模块中可见.因为Swift通常单独编译组成模块的文件,所以编译器无法确定是否在不同的文件中覆盖了内部声明.但是,如果启用了整个模块优化,则所有模块将同时编译在一起.这允许编译器一起推断整个模块,如果没有可见的覆盖,则使用internal推断最终的声明.

您可以在项目设置中启用它:

整个模块优化

但要注意,此选项可以优化目标中的所有文件,并以增加编译时间为代价实现更好的性能.


Sak*_*gla 6

为了在调试模式下将优化级别设置为最快、最小 [-Os] 来捕获崩溃测试,以更接近地模拟将在用户设备上生成和运行的代码。

您可以在 Swift Compiler/Code Generation 下的构建设置中进行设置