不确定这是否是 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 上以调试模式运行我的应用程序时,一切正常,清理代码和警报会像我执行运行上面代码的“删除帐户”操作时那样显示。
但是,当我通过 Testflight 将我的应用程序发送给用户或直接在同一台 iPhone 上运行我的应用程序但使用 Release 构建配置时,清理代码不会运行并且警报不会显示。看起来整个闭包没有被调用。
有人经历过这种奇怪的行为并知道如何预防吗?我不确定这里的问题是什么,因此我很难找出适用于调试和发布模式的解决方案。
感谢您的帮助!
环境: 我使用 Alamofire 1.1.3 作为嵌入式框架,作为 git 子模块集成到我的项目中。该应用程序仅在 iOS 8+ 上运行,我的 iPhone 6 上安装了 iOS 8.1.2。
在与您的项目(Swift + Objective-C)类似的项目中构建发布时,我遇到了一些类似的问题,在我的例子中,它跳过了循环中的一段代码,但它并没有跳过循环本身。 为了解决这个问题,我们在
Build Settings -> Apple LLVM 6.0 Code Generation -> Optimization Level
处将 Debug 的值更改为 Fastest, Smallest [-Os]
,这与 Release 相同,然后我们在 Debug 上遇到了相同的错误。然后我们尝试将两者更改为 None [-O0]
(这是调试默认值),但它只会使错误在调试模式下消失,而不是在发布模式下消失,因此我们必须解决该代码并更改一点 UI。
我愿意相信这是编译器在 Release 中所做的事情,我们无法更改,所以也许这是一个 Xcode Bug。
这不是一个真正的解决方案,但作为一种解决方法,它只是不将代码放入完成处理程序中。相反,它现在是方法的一部分(当然,所有上下文变量都需要在该方法中访问)并且我保存我发出的请求类型。
当上面示例中的
request
方法运行并检查它是否有要运行的完成闭包代码时,我还添加了对类型的检查,如果它是发生错误的类型,那么它只是调用完成代码所在的方法现在已经到了。
这当然非常丑陋,但在苹果修复这个错误之前(我向他们发送了带有示例代码的错误报告),我无法找出任何其他解决方案。也许这个解决方法也对其他人有帮助。如果我的描述令人困惑,请告诉我,我会尝试使用一些示例代码来使其更加清晰。
答案可能是我对问题应用程序在发布版本中崩溃但在调试中崩溃的上一个答案。
Apple 还描述了一个已知的问题。我简要描述一下,以防有人正在寻找答案并且之前的解决方案不起作用。
检查崩溃日志是否有类似
的错误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 下也可以轻松查看日志。点击设备,然后点击查看设备日志。
1 - 进入项目设置
2 - 选择目标
3 - 选择构建设置
4 - 搜索“优化级别”
5 - 在调试和发布中设置不优化
6 - 运行您的应用程序
有关更多信息,请阅读优化您的 iOS 应用程序构建:速度与大小