我在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
。发生了什么事?对我而言,弱引用应该有效。
答案 0 :(得分:1)
在撰写本文时(Xcode 6 Beta 5),弱代表有一个错误。目前,在修复之前所能做的就是将protocol MyProtocol: class
更改为@objc protocol MyProtocol
,并避免在协议中使用任何纯Swift类。
答案 1 :(得分:0)
临时替代解决方案是改变这个:
weak var delegate: MyProtocol?
到此:
weak var delegate: MyController?
当然它违背了MyProtocol的目的,但是,它允许你在我们等待正确的修复时使用纯Swift类。