更新:这是固定在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只允许协议被类采用(没有结构或枚举一致性).