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编程手册:
如果用@objc替换@class_protocol,它不应该崩溃.另外根据手册,使用@objc只允许协议被类采用(没有结构或枚举一致性). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |