我在Swift (OSX)中的委托有一个问题。我有一个视图,通过弱引用连接到一个委托。简化后的代码可以像这样:
protocol MyProtocol: class {
func protocolFunc() -> Int
}
class MyController : MyProtocol {
func protocolFunc() -> Int { return 2 }
}
class MyView : NSView {
weak var delegate: MyProtocol?
func grabData {
var data = delegate?.protocolFunc()
}
}
当调用delegate?.protocolFunc()
时,应用程序崩溃,说"访问不良"。就像如果MyController实例消失了…但事实并非如此。MyController实例驻留在NSDocument的子类中;并且视图的委托被正确设置。
如果我将委托声明为strong
,崩溃就会消失。但问题是,我希望委托是weak
。这是怎么呢在我看来,弱引用应该有效。
在撰写本文时(Xcode 6 Beta 5),有一个弱委托的错误。目前,在它被修复之前,你所能做的就是将protocol MyProtocol: class
更改为@objc protocol MyProtocol
,并避免在协议中使用任何纯Swift类。
一个临时的替代解决方案是:
weak var delegate: MyProtocol?
:
weak var delegate: MyController?
当然,它违背了MyProtocol的目的,然而,它允许你使用纯Swift类,而我们等待一个适当的修复。