我发现有些程序员会在充当someController.delegate = nil
的委托的视图控制器的deinit
方法中设置someController
。
这是什么意思?它可以避免什么错误?代表是否被视为强有力的参考?
答案 0 :(得分:0)
这是(过时的)避免保留周期。如果类对对象拥有强大的引用,而对象通过委托对类拥有强大的引用,则它们将永远不会被释放。像这样:
protocol MyDelegate {
}
class MyClass: MyDelegate {
// A STRONG REFERENCE TO ANOTHERCLASS
var someProperty: AnotherClass
...
someProperty.delegate = self
}
class AnotherClass {
// A STRONG REFERENCE TO MYCLASS (since MyClass is the MyDelegate)
var delegate: MyDelegate
}
如您所见,MyClass
保留了someProperty
。 someProperty
保留其委托,我们将其设置为MyClass
如果彼此保留会造成内存泄漏。
现在,通过在委托上使用弱关键字(建议),可以轻松解决此问题。像这样:
// need to use :class on the delegate to allow for it to be marked as weak
protocol MyDelegate: class {
}
class MyClass: MyDelegate {
var someProperty: AnotherClass
...
someProperty.delegate = self
}
class AnotherClass {
// it is recommended to mark delegates as weak
weak var delegate: MyDelegate?
}
这会自动使从AnotherClass
到MyClass
的连接成为弱连接,如果释放MyClass
,该连接将不会保留。
因此,我不建议在dealloc中设置委托= nil,而是遵循弱委托约定。