Swift在调试和释放模式下表现不同

时间:2015-01-26 15:23:29

标签: ios swift closures alamofire release-mode

不确定这是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上以调试模式运行我的应用程序然后一切正常时,清理代码和警报会像我们执行&时那样呈现#34;删除帐户"运行上面代码的动作。

但是,当我通过Testflight将应用程序发送给用户或直接在同一个iPhone上运行我的应用程序但使用发布版本配置,然后清理代码无法运行警报不会显示。看起来整个封闭都没有被调用。

有没有人有这种奇怪行为的经验,知道如何预防它们?我不确定这里的问题是什么,因此我很难找到适用于调试和发布模式的解决方案。

感谢您的帮助!

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

3 个答案:

答案 0 :(得分:4)

我在类似于你的项目(Swift + Objective-C)中构建发布时遇到了类似的问题,在我的情况下,它是在循环中跳过一段代码,但它没有跳过循环本身。 为了解决这个问题,我们在Build Settings -> Apple LLVM 6.0 Code Generation -> Optimization Level将Debug的值更改为Fastest, Smallest [-Os],这与Release相同,然后我们在Debug上遇到了相同的错误。然后我们尝试将两者都更改为None [-O0](这是Debug默认值),但它只是让错误在Debug模式下消失,而不是在Release中,因此我们必须解决该代码并更改UI的一小部分。 / p>

我想相信编译器在Release中做的事情是我们无法改变的,所以它可能是一个Xcode Bug。

答案 1 :(得分:2)

答案可能是我之前提出的问题App crashes in Release build but not in debug

Apple还描述了一个已知的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

如果您有类似上面的崩溃输出,请关注apple guidance

PS:即使在Window - > XCode中的设备下,您也可以轻松查看日志。单击设备,然后单击查看设备日志。

答案 2 :(得分:1)

它不是一个真正的解决方案,但作为一种解决方法,它只是不将代码放在完成处理程序中。相反,它现在是方法的一部分(当然,所有上下文变量都需要在该方法中访问)并且我保存我提出的请求类型

当上面示例中的request方法运行并检查它是否有要运行的完成闭包代码时,我还添加了对类型的检查,如果它是发生错误的类型,那么它只需调用完成代码所在的方法。

这当然非常难看,但在Apple修复此错误之前(我向他们发送了一个带有示例代码的错误报告),我无法找出任何其他解决方案。也许这种解决方法也可以帮助其他人。如果我的描述令人困惑,请告诉我,我将尝试使用一些示例代码更清楚。