Swift在debugging和发布模式下performance不同

不知道这是与Swift,XCode或Alamofire的问题,但我认识到我的Swift / Objc混合应用程序中不同的地方奇怪的行为 。 它只发生在用Swift编写的部分,并使用闭包/联网。 下面是一个示例代码:

Alamofire.request(.DELETE, "http://someUrl.com/user", parameters: nil) .response { (request, response, data, error) in // some cleanup code and an alert } 

当我在我的iPhone上以debugging模式运行我的应用程序时, 它们都可以正常工作 ,清理代码和警报会像我们执行上面的代码所执行的“删除帐户”操作一样呈现。

但是,当我通过Testflight将应用程序发送给用户,或直接在同一个iPhone上运行我的应用程序,但使用发布构buildconfiguration时 ,清理代码不会运行并且不显示警报 。 它看起来像整个封闭不叫。

有没有人有这种奇怪的行为的经验,并知道如何防止他们? 我不确定这里有什么问题,因此我很难找出一个可以在Debug和Release模式下工作的解决scheme。

感谢您的任何帮助!

环境:我使用Alamofire 1.1.3作为embedded式框架,作为git子模块集成到我的项目中。 该应用程序只运行在iOS 8+上,我的iPhone 6上安装了iOS 8.1.2。

在类似于你自己的项目(Swift + Objective-C)中构build发布版本时,我遇到了一些类似的问题,在我的情况下,它跳过循环内的一段代码,但并没有跳过循环本身。 为了解决这个问题,我们在Build Settings -> Apple LLVM 6.0 Code Generation -> Optimization Level调整了Debug的值到Fastest, Smallest [-Os] ,这与Release是一样的,然后我们得到了Debug 。 然后,我们试图将两者都更改为None [-O0] (这是Debug的默认值),但它只是使Bug在Debug模式下不在Release中消失,所以我们必须解决该代码并更改一点UI。

我想相信这是编译器在Release中做的事情,不能被我们改变,所以也许它是一个Xcode的错误。

答案可能是上一个我给的问题应用程序崩溃在发布版本,但不是在debugging 。


苹果还介绍了一个已知的问题 。 我简要描述一下,以防有人在寻找答案,以前的解决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下,也可以轻松地检查日志。 点击设备并点击查看设备日志。

这不是一个真正的解决scheme,但作为一个解决方法,它只是不把代码放入完成处理程序。 相反,它现在是方法的一部分 (当然,所有上下文variables都需要在该方法中可访问),并保存我所做的请求types

当我上面的例子中的request方法运行,并检查是否有一个完成闭包代码运行我额外添加了一个types的检查,如果这是错误发生的types,那么它只是调用完成代码现在的方法。

这当然是非常丑陋的,但直到苹果修复这个错误(我发给他们一个错误报告与示例代码)我找不出任何其他解决scheme。 也许这个解决方法也可以帮助其他人。 如果我的描述很混乱,请告诉我,我将尝试使用一些示例代码更清晰。

Interesting Posts