gpt4 book ai didi

closures - Swift 中的所有变量或惰性变量初始值设定项都必须包含弱 self 吗?

转载 作者:行者123 更新时间:2023-12-05 08:42:32 26 4
gpt4 key购买 nike

我见过很多使用闭包来初始化 var 或 lazy var 的代码,它们在没有 weak self 语法的情况下引用 self。这不会产生保留周期的风险吗?为什么编译器不标记它?在使用任何类型的闭包作为安全措施时,是否必须始终使用 weak self 或 unowned self?

例如

class Test {
lazy var tableView: UITableView = {
let tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.delegate = self
tableView.dataSource = self

return tableView
}
}()

最佳答案

不是闭包属性的惰性变量不会被任何东西保留,因此无需在此处使用 [unowned self]:

class Test {
lazy var tableView: UITableView = {

let tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.delegate = self
tableView.dataSource = self
return tableView
}()
}

这不要与惰性定义的闭包属性混淆!然后闭包捕获 self,这将创建一个保留循环。在这种情况下,您正在通过 self.view.bounds 创建强引用,因此您应该使用 [unowned self](您知道在这种情况下,如果 Test 对象不存在,则 tableView 不应该存在).

class Test {
lazy var tableView: () -> UITableView = {
[unowned self] in

let tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.delegate = self
tableView.dataSource = self
return tableView
}
}

进一步阅读:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

https://krakendev.io/blog/weak-and-unowned-references-in-swift

关于closures - Swift 中的所有变量或惰性变量初始值设定项都必须包含弱 self 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40794464/

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