弱引用、无主引用或无引用。

3

我有一个如下所示的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)?
}

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

如果会创建一个强引用循环,那么应该使用什么 - 弱引用还是无主引用?

1个回答

2

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

ViewController 持有 ViewModel 的强引用。 ViewModel 持有闭包的强引用。该闭包持有对 ViewController弱引用

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

只要ViewController被解除分配(例如,当您关闭它时),ViewModel也将被释放。

如果不使用weak,则存在强引用循环,我说的对吗? - Savan Kavaiya
谢谢。这里应该使用哪个更好?weak 还是 unowned?我认为 ViewModel 和 ViewController 的生命周期相同,因此使用 unowned 而不是 weak 是安全的。你有什么想法? - Savan Kavaiya
@SavanKavaiya 是的,我想是这样。请注意,如果其他东西对闭包有强引用,您应该使用 weak,因为闭包可以在没有 VC 的情况下存在。 - Sweeper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接