gpt4 book ai didi

ios - 将 delegate 设置为 nil 是什么意思?

转载 作者:行者123 更新时间:2023-11-30 11:19:22 24 4
gpt4 key购买 nike

我发现一些程序员会在充当 someController 委托(delegate)的 View Controller 的 deinit 方法中设置 someController.delegate = nil .

这句话的意思是什么?它可以避免什么样的错误? delegate 是否被视为强有力的引用?

最佳答案

这是避免循环引用的(一种过时的方法)。如果类持有对对象的强引用,并且该对象通过委托(delegate)持有对类的强引用,则它们永远不会被释放。像这样的东西:

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 保留其委托(delegate),我们将其设置为 MyClass

如果它们相互保留就会造成内存泄漏。

现在,通过在委托(delegate)上使用weak关键字(按照建议)可以轻松解决这个问题。像这样的东西:

// 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,而是遵循弱委托(delegate)约定。

关于ios - 将 delegate 设置为 nil 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51450510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com