2014-09-02 77 views
23

正如我在标题中所说的,我正在为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] 
} 

我使用来自兄弟的框架不支持AirPrint打印,但我认为是没有问题的,因为这样做的东西与之前的应用程序崩溃该框架。 它只在我执行这些行的ViewController中崩溃。我只需要这个ViewController中的框架。

+7

如果关闭斯威夫特编译器的优化的发布版本,并再次尝试它,你仍然得到崩溃? (在编译设置下,在Swift编译器/代码生成下) – 2014-09-02 19:13:07

+0

如果我这样做,我不能通过TestFlight安装它:'无效的配置文件:分发版权授权必须将get-task-allow设置为false。 但我尝试使用iTunes .. 编辑:不适用于iTunes和Xcode安装.. – Ben 2014-09-02 19:18:56

+0

是的!有效!非常感谢。请将您的评论写为答案,以便我可以将其标记为正确答案 – Ben 2014-09-02 19:29:25

回答

36

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

如果您按照我的建议进行操作,并且针对优化关闭的版本进行构建,则说问题消失。鉴于Swift编译器仍处于测试阶段,并且肯定仍然存在偶然的问题 - 我发现编译器在构建优化版本时会发生崩溃 - 这实际上可能是一个优化器错误。

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

+0

感谢这个伟大的答案! – Ben 2014-09-03 08:54:52

+1

我也是这样,应用程序在调试模式下工作正常,但使用测试飞行它崩溃。但现在我遵循了你的建议,并且工作正常。非常感谢! “如果关闭发布版本的Swift编译器优化,然后再试一次,还是会发生崩溃?(在构建设置中,在Swift编译器/代码生成下)” – mizerablebr 2015-02-20 12:41:54

+0

感谢您的解决! Swift 1.2仍然存在这个问题。 – werm098 2015-03-20 23:24:15

7

我遇到了同样的问题。我终于通过打开whole module optimization来修复它。结合access control 的正确实施,这应该可以解决您的崩溃问题。根据苹果

整个模块的优化:

使用整个模块的优化来推断最终的内部声明。 具有内部访问权限的声明(默认情况下,如果没有声明) 仅在声明它们的模块内可见。由于 Swift通常分别编译组成模块的文件,因此编译器无法确定内部声明 是否在其他文件中被覆盖。但是,如果整个模块 已启用优化,则所有模块将同时编译在 处。这允许编译器将关于 整个模块的推论结合在一起,并在内部 (如果没有可见覆盖)的情况下推断最终的声明。

您可以在您的项目设置启用此:

Whole Module Optimization

但要注意此选项优化的所有文件中的目标一起,实现了更好的性能在增加编译时间成本。

+0

谢谢,你救了我的周末。 – kubilay 2017-03-03 15:01:41

0

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

检查你的系统崩溃日志中的错误就像

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 

,并按照苹果guidance如果你有一个像上面的一个类似的崩溃输出。 PS:你甚至可以在XCode中的窗口 - >设备下检查日志。点击设备并点击查看设备日志。

0

要在崩溃测试中将优化级别设置为调试模式下最快,最小[-Os],以便更仔细地模拟将在用户设备上运行的代码&。

您可以设置它在构建设置,斯威夫特下编译/代码生成

相关问题