swiftautomatic-ref-countingweak-referencesunowned-references

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?


Solution

  • 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.