将委托设置为零是什么意思?

  • 本文关键字:是什么 设置 ios swift
  • 更新时间 :
  • 英文 :


我发现一些程序员会在deinit方法中设置someController.delegate = nil,视图控制器充当someController的委托。

它的含义是什么?它可以避免什么样的错误?委托是否被视为强有力的参考?

这是(一种过时的方法)以避免保留周期。如果类持有对对象的强引用,并且对象通过委托持有对类的强引用,则它们永远不会被解除分配。像这样:

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?
}

它会自动使连接从AnotherClassMyClass弱连接,如果MyClass被解除分配,该连接将不会保留。

所以我不建议在 dealloc 中设置 delegate = nil,而是遵循弱委托约定。

最新更新