应用程序崩溃发布版本,但不是在debugging

正如我在标题中所说,我正在为iPhone编写一个应用程序,它在debugging模式下完美运行,但是当我将它构build为发行版并通过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] } 

我正在使用Brother的框架打印没有AirPrint,但我认为这不是问题,因为应用程序崩溃之前做一些框架。 它只在这个ViewController中崩溃,我执行这些行。 我只需要在这个ViewController的框架。

有很多原因可能导致应用程序在发布模式下崩溃,而不是在debugging模式下(例如,内存分配差异显示了两个版本中实际存在的错误)。他们可能需要大量工作才能追查, beta编译器/语言。

你说,如果你按照我的build议去做,那么问题就会消失。 鉴于Swift编译器仍然处于testing阶段,而且肯定仍然存在偶然的问题 – 我发现编译器在构build优化版本时会发生崩溃 – 这实际上可能是一个优化器错误。

因此,现在,我会推迟对它进行研究。 直到我们获得编译器的完整发行版本,才发布而不进行优化。 然后,再次优化,看看你是否仍然有问题。 如果你这样做的话, 现在是时候开始花费精力去弄清楚它是一个编译器错误还是你自己代码中的错误。

我有同样的问题。 我最终通过打开whole module optimization修复它。 结合访问控制的正确实现,这应该可以解决您的崩溃问题。

根据苹果的整体模块优化:

使用整体模块优化来推断最终的内部声明。 具有内部访问权限的声明(默认情况下,如果没有声明)只在声明它们的模块中可见。 因为Swift通常分别编译构成模块的文件,所以编译器无法确定是否在不同的文件中覆盖内部声明。 但是,如果启用全模块优化,则所有模块都将同时编译在一起。 这使得编译器能够对整个模块进行推理,并且如果没有可见的覆盖,就可以推断出内部声明的最终结果。

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

整个模块的优化

但是请注意,此选项可以优化目标中的所有文件,并以编译时间增加为代价来提高性能。

苹果还介绍了一个已知的问题 。 我简要描述一下,以防有人在寻找答案,以前的解决scheme不起作用。

检查你的crashlog中的错误

 Dyld Error Message: Library not loaded: @rpath/libswiftCore.dylib 

要么

 [....] [deny-mmap] mapped file has no team identifier and is not a platform binary: /private/var/mobile/Containers/Bundle/Application/5D8FB2F7-1083-4564-94B2-0CB7DC75C9D1/YourAppNameHere.app/Frameworks/libswiftCore.dylib 

并按照苹果的指导,如果你有类似的崩溃输出像上面那样。

PS:即使在XCode中的Window – > Device下,也可以轻松地检查日志。 点击设备并点击查看设备日志。

要在“debugging”模式下将“优化级别”设置为“最快,最小”[-Os]来进行崩溃testing,以便更仔细地模拟将在用户设备上生成并运行的代码。

您可以在生成设置,在Swift编译器/代码生成