Weak or Unowned or None

192 views Asked by At

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?

1

There are 1 answers

3
Sweeper On BEST ANSWER

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.