繁体   English   中英

Swift在调试和发布模式下的行为有所不同

[英]Swift behaves differently on debug and 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上的“ 调试”模式下运行应用程序时, 它们都可以正常使用 ,就像我执行上面的代码的“删除帐户”操作时一样,清理代码和警报也会像显示的那样显示。

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

是否有人对这种奇怪的行为有经验并知道如何预防? 我不确定这里是什么问题,因此很难找到适用于Debug和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] (这是Debug的默认值),但这仅使Bug在Debug模式下消失,而不是在Release中,因此,我们必须解决该代码并更改UI的一部分。

我想相信这是编译器在Release中所做的事情,我们无法更改,因此也许是Xcode Bug。

这不是一个真正的解决方案,但作为一种变通办法,它的作用是不将代码放入完成处理程序中。 相反,它现在是方法的一部分 (当然,所有上下文变量都必须在该方法内可以访问),并且我保存了发出的请求的类型

当我上面的示例中的request方法运行并检查是否有完成关闭代码要运行时,我还添加了对该类型的检查,以及是否是发生错误的类型,然后它仅调用该方法来完成代码。 。

这当然很丑陋,但是直到Apple修复了该错误(我向他们发送了包含示例代码的错误报告)之后,我才能找到其他解决方案。 也许这种解决方法也可以帮助其他人。 如果我的描述令人困惑,请告诉我,我将尝试通过一些示例代码来使其更清楚。

答案可能是我之前对“ 版本崩溃但不是在调试时发生App崩溃”的回答。


苹果还描述了一个已知问题 如果有人正在寻找答案并且以前的解决方案不起作用,我会简要描述一下。

检查您的崩溃日志中是否有类似的错误

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下,您也可以轻松检查日志。 单击该设备,然后单击查看设备日志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM