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

前端之家收集整理的这篇文章主要介绍了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只允许协议被类采用(没有结构或枚举一致性).

猜你在找的Swift相关文章