使用Xcode9.4和Swift4.1打包App Store时出现Speculative Devirtualization错误
解决Xcode 9.4归档时的"Speculative Devirtualization via Guarded Calls"错误
你在使用Xcode 9.4搭配Swift 4.1开发应用,归档生成App Store构建包时碰到了这个编译器报错,我结合你贴的代码和常见的问题场景,整理了几个可行的解决办法:
问题根源分析
这个错误属于Swift编译器的优化bug,通常在处理连续的属性赋值、尤其是第三方自定义控件的属性设置时触发。从你viewDidLoad里的代码来看,大概率是对lExpandableSummary和lDesclaimer这两个可折叠标签的一系列属性赋值,触发了编译器的speculative devirtualization逻辑异常。
具体解决方案
你可以按顺序尝试下面这些方法:
临时关闭Release模式的编译器优化
这是最快的临时 workaround,能快速完成归档:- 打开项目的
Build Settings - 搜索
Optimization Level选项 - 将
Release配置下的优化级别从Fastest, Smallest [-Os]修改为None [-O0] - 重新执行归档操作
注意:这个方法只是临时应急,长期建议升级Xcode版本彻底修复问题。
- 打开项目的
调整代码赋值逻辑
连续的属性赋值可能触发编译器的异常判断,你可以把控件属性的赋值逻辑包装到主队列异步调用里,或者拆分为更分散的语句,让编译器的处理逻辑改变:override func viewDidLoad() { super.viewDidLoad() var attributes = [String: AnyObject]() attributes[NSForegroundColorAttributeName] = UIColor.red self.setAndUpdateViewsData(self.kristal) // 用主队列异步包装属性赋值逻辑 DispatchQueue.main.async { self.lExpandableSummary.numberOfLines = 2 self.lExpandableSummary.collapsed = true self.lExpandableSummary.collapsedAttributedLink = NSAttributedString(string: "show more", attributes: attributes) self.lExpandableSummary.expandedAttributedLink = NSAttributedString(string: "show less", attributes: attributes) self.lExpandableSummary.ellipsis = NSAttributedString(string: " ...") self.lDesclaimer.numberOfLines = 2 self.lDesclaimer.collapsed = true self.lDesclaimer.collapsedAttributedLink = NSAttributedString(string: "show more", attributes: attributes) self.lDesclaimer.expandedAttributedLink = NSAttributedString(string: "show less", attributes: attributes) self.lDesclaimer.ellipsis = NSAttributedString(string: " ...") } }升级Xcode版本(推荐长期方案)
这个错误是Swift 4.1和Xcode 9.x版本中的已知编译器bug,苹果在后续的Xcode 10及以上版本中已经修复了该问题。如果项目允许,建议升级到更高版本的Xcode和Swift,从根源上解决这类编译异常。检查第三方控件兼容性
如果lExpandableSummary和lDesclaimer是第三方库提供的控件,确认其是否适配Swift 4.1和Xcode 9.4。如果该库有更新版本,尝试升级后再重新归档。
内容的提问来源于stack exchange,提问作者Sandeep Rana
相关产品推荐
相关产品推荐

