我已经看到很多代码使用闭包初始化一个var或lazy var,它引用self而没有弱自我语法。是否会产生保留周期的风险?为什么编译器没有标记出来?在使用任何类型的封闭作为安全措施时,总是使用弱自我或无主自我是强制性的吗?
e.g。
class Test {
lazy var tableView: UITableView = {
let tableView = UITableView(frame: self.view.bounds, style: .plain)
tableView.delegate = self
tableView.dataSource = self
return tableView
}
}()
答案 0 :(得分:3)
没有任何东西不保留不是闭包属性的惰性变量,所以不需要在这里使用[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://krakendev.io/blog/weak-and-unowned-references-in-swift