Swift 4.1 的 swift_getObjectType 崩溃问题

图拉鼎 2018-04-08 11:59

之前我跟踪了好久的 Xcode 9.3 的 Swift 4.1 编译速度改进的情况,见《评测 Xcode 9.3 Beta + Swift 4.1 对编译速度的提升》,我从第一个 Beta 一直测试到正式版,可以说 Swift 4.1 的编译速度至少有了 25% 的改进,是一个非常好的消息。然而这两天又碰到一个 Swift 4.1 的崩溃问题,让我对其又失望了一把。

昨天奇点内测用户 Xerol 给我报告「Twitter 同步功能」在授权后就崩溃的问题,我试着重现了一下,发现可以重现。于是我连接至 Xcode 开始 Debug,发现挂在了这个位置:

Xcode Swift 4.1 Crash

挂在了swift_getObjectType,但是没有任何多余的 Stack Traceback 信息,就是 main 函数。我想解决这个问题,毕竟 Crash 还是挺严重的,尽管这个功能的使用人数并不多。

奇点用 Twitter 接口,是通过OAuthSwift这个库,并使用 Carthage 包管理的形式来解决的。为了方便 Debug,我临时切换成了 CocoaPods 来使用这个库,发现这个库还没有很好地适配 Swift 4.1,有好几个 Warning,但是不至于会引起 Crash 吧。结果我换成 CocoaPods 来集成时,依然 Crash 在swift_getObjectType。

后来我升级至 CocoaPods 1.5,它支持使用 Static Library 的形式来集成第三方库,也是一样 Crash。看来换一种集成方式并不能解决问题、甚至连出错信息还是一模一样,无助于去发现问题。

这时候我想,试试直接跑 OAuthSwift 里面的 demo,看看有没有问题,万一这个 demo 都跑不起来了,可能确实需要去适配 Swift 4.1 呢?结果并没有超出我的预期:demo 很正常地跑起来了,也就是说,OAuthSwift + Swift 4.1 在实际上是可以很好的工作的,问题就出在 OAuthSwift + 奇点 + Swift 4.1 上。

但现在的情况,让我除了知道 Crash 在swift_getObjectType,没有任何线索。我想到了最后一招:试试 Xcode 9.4 beta 吧,这个版本应该带着新一点的 Swift 版本。

于是我费了好大劲下载了 Xcode 9.4 beta,编译 App,Debug 一模一样的步骤,问题没有发生…

Xcode Swift 4.1 Crash 2

后来我验证了一下,Xcode 9.4 beta 自带的 Swift 是 4.1.1 版本的,看来是把这个问题给修复了。

所以就至此为止了,这个新的问题,即不是 OAuthSwift 这个第三方库没有适配 Swift 4.1 的问题,也不是奇点和这个库哪里的调用出了问题,就是 Swift 4.1 的一个 Bug。

还能怎么样,只能等 iOS 11.4 正式发布了。

今年 Swift 5.0 要正式发布,只能希望这是一个能真正稳定的版本了。

2018 年 4 月 10 日更新

今天有一个推友问我:用了这个方法吗?,他指的是:optional func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool这个方法。

我一看,真用了,而且联系到 Twitter 验证的这个环节,确实是会去调用这个。于是我尝试把这个方法移除,然后一试,问题解决。看来是 iOS 11.3 的 SDK 出了一点问题。

本站架设于Linode 东京机房

[返回] [原文链接]