加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:42:37 所属栏目:百科 来源:网络整理
导读:更新:这是固定在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 = bardelegate?.foo() 但
更新:这是固定在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只允许协议被类采用(没有结构或枚举一致性).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读