【发布时间】:2014-06-11 23:44:22
【问题描述】:
更新:这已在 Xcode 6 beta 6 中修复。
以下代码导致delegate?.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()
但在我看来一切都是正确的。为了使变量成为weak,它必须具有可选类型。所以变量delegate 是可选的。弱变量的类型也必须是类类型,所以我将协议设置为类协议。由于我使用可选链接,我希望它要么 1) 是 nil,并且什么都不做,或者 2) 不是 nil,然后调用该方法,这应该会成功。但是,它崩溃了。
可能是可选链接不是原子的并且不保留表达式并且对象在检查nil 和随后的调用之间以某种方式被释放?
有趣的是,如果您消除变量bar 并将其直接赋值为delegate = Bar(),那么崩溃就消失了。这真的很令人困惑,因为将表达式分配给变量然后分配变量并直接分配表达式通常应该表现相同。
【问题讨论】:
-
如果这是另一个 Swift 错误,这并不奇怪
-
我玩过它,只有当它既是弱协议类型的 和 时才会发生这种情况(即将声明更改为
weak var delegate: Bar?或var delegate: Fooable?解决这个问题)。绝对看起来像一个错误。 -
我在 XCode 6.1 上遇到了同样的问题。当我在调试模式下运行它时,它很好。但发生在发布模式。
标签: swift weak-references