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