【问题标题】:Weak or Unowned or None弱或无主或无
【发布时间】:2018-03-31 09:28:07
【问题描述】:

我有一个如下所示的 ViewController 类:

class ViewController {

    var viewModel = ViewModel()

    viewDidLoad() {
        self.viewModel.showAlert = { [weak self] in
            self?.alert()
        }
    }

    func alert() {
        // alert logic
    }
}

这里是 ViewModel 类

class ViewModel {
    var showAlert: (() -> Void)?
}

现在,这是否会创建一个强引用循环?

如果这创造了一个,那么使用什么 - 弱或无主?

【问题讨论】:

    标签: swift automatic-ref-counting weak-references unowned-references


    【解决方案1】:

    不会创建一个强引用循环,因为您使用了weak self

    ViewController 拥有对ViewModel 的强引用。 ViewModel 持有对闭包的强引用。闭包持有对ViewController引用:

    VC ---strong---> ViewModel
     ^                    |
     |                   strong
     |                    v
      --------weak-----closure
    

    只要ViewController 被解除分配(例如,当您解除它时就会发生这种情况),ViewModel 也会被解除分配。

    【讨论】:

    • 如果不使用weak那就是强引用循环,我说的对吗?
    • 谢谢。这里有什么可取的?弱或无主?我认为 ViewModel 和 ViewController 都有相同的生命周期,所以使用 unowned 而不是 weak 是安全的。你的想法?
    • @SavanKavaiya 是的,我想。请注意,如果其他东西持有对闭包的强引用,则应使用弱,因为闭包可以在没有 VC 的情况下存在。
    猜你喜欢
    • 2019-09-14
    • 2016-01-27
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多