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

时间:2018-07-20 21:19:59

标签: ios swift

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

这是什么意思?它可以避免什么错误?代表是否被视为强有力的参考?

1 个答案:

答案 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保留了somePropertysomeProperty保留其委托,我们将其设置为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中设置委托= nil,而是遵循弱委托约定。