swift – 使用弱变量上的可选链接的调用方法导致EXC_BAD_ACCESS

更新:这是固定在Xcode 6 beta 6.

以下代码在委托?.thing()行上导致EXC_BAD_ACCESS:

@class_protocol protocol Fooable {
  func foo()
}

class Bar : Fooable {
  func foo() {
  }
}

weak var delegate: Fooable?

let bar = Bar()
delegate = bar
delegate?.foo()

但一切似乎对我来说都是对的.为了使变量变弱,它必须具有可选类型.所以变量委托是可选的.弱变量的类型也必须是类类型,所以我将协议作为类协议.由于我使用可选链接,我希望它可以是1)为零,不做任何事情,或2)不为零,并调用应该成功的方法.但是,它崩溃了.

这可能是可选链接不是原子的,并且不保留表达式,并且对象以任何方式在检查为零和随后的调用之间取消分配?

有趣的是,如果您删除变量条并直接分配为delegate = Bar(),则崩溃消失.这真的很困惑,因为将一个表达式分配给变量,然后分配变量并直接分配表达式通常应该是相同的.

我怀疑这个原因很弱var delegate:Fooable?不工作是因为使用可选链接的代码行正在检查协议一致性.

根据Apple Swift编程手册:

“Even if you are not interoperating with Objective-C,you need to mark
your protocols with the @objc attribute if you want to be able to
check for protocol conformance.”

如果用@objc替换@class_protocol,它不应该崩溃.另外根据手册,使用@objc只允许协议被类采用(没有结构或枚举一致性).

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...