我有一个很大的背景作为c ++ dev,但我仍然是Swift / Objective-C区域的新手。我正在尝试构建一个类层次结构,我对这段代码感到困惑:
protocol CADelegate : class {
func g()
}
class CA : NSObject {
init(i: Int) {}
func f() {
if let del = getDelegate() {
del.g()
} else {
println("delegate is null")
}
}
private func getDelegate() -> CADelegate? {
return nil
}
}
class CB : CA {
override init(i: Int) {
super.init(i:i)
}
var delegate: CADelegate!
private override func getDelegate() -> CADelegate? {
return delegate
}
}
class Client : CADelegate {
func g() {
println("CA delegate")
}
}
class ViewController : ... {
override func viewDidLoad() {
var cb = CB(i: 1)
var client = Client()
cb.delegate = client // the problem row!!!
cb.f()
}
}
在“问题行”上我收到运行时错误EXC_BAD_ACCESS(code = 1,address = ...)。
有人可以帮我解决这个问题吗?我知道我做错了,因为我习惯使用C ++习语和编程风格。
注意:如果委托属性很弱,同样如此,就像在原始代码中一样。
编辑1: 我正在使用XCode6 Beta 7
编辑2: 事实证明它不是100%可重复的。 5次中有3次正在工作但是另外2次我遇到了错误的访问异常。它看起来像一个竞争条件,但我没有使用任何其他任务/线程。这是我的主视图控制器,应该在视图控制器初始化时调用viewDidLoad。
编辑3: 更奇怪的是 - 如果我在CA和CB中删除我的构造函数,并在没有int参数的情况下更改CB的创建,问题就会消失!我现在肯定它看起来像个bug:)