Swift中的所有变量或惰性变量初始化器都必须包含弱自我吗?

时间:2016-11-24 21:04:20

标签: closures swift3

我已经看到很多代码使用闭包初始化一个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
  }
}()

1 个答案:

答案 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://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

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