Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weak or Unowned or None

I have a ViewController class as shown below:

class ViewController {

    var viewModel = ViewModel()

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

    func alert() {
        // alert logic
    }
}

Here is the ViewModel class

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

Now, does this create a strong reference cycle or not?

And if this creates one, then what to use - weak or unowned?

like image 512
Savan Kavaiya Avatar asked Jan 29 '26 23:01

Savan Kavaiya


1 Answers

This does not create a strong reference cycle, because you used weak self.

ViewController holds a strong reference to ViewModel. ViewModel holds a strong reference to a closure. The closure holds a weak reference to the ViewController:

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

As long as ViewController is deallocated (this happens when you dismiss it for example), ViewModel will be as well.

like image 51
Sweeper Avatar answered Jan 31 '26 20:01

Sweeper



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!