I'm having trouble figuring out exactly when UIViewControllers are expected to deallocate. I created the simplest of tests, in which I have 3 UIViewControllers on a storyboard, each with a button which performs a segue to the next, so 1->2->3->1->.. and so forth. I then log the appear/disappear load and init/deinit methods, however the deinit is never called.
The log looks like this:
<StoryBoardTest.TestViewController: VC1> init
<StoryBoardTest.TestViewController: VC1> View did load
<StoryBoardTest.TestViewController: VC1> View did appear
<StoryBoardTest.TestViewController: VC2> init
<StoryBoardTest.TestViewController: VC2> View did load
<StoryBoardTest.TestViewController: VC2> View did appear
<StoryBoardTest.TestViewController: VC1> View did disappear
<StoryBoardTest.TestViewController: VC3> init
<StoryBoardTest.TestViewController: VC3> View did load
<StoryBoardTest.TestViewController: VC3> View did appear
<StoryBoardTest.TestViewController: VC2> View did disappear
<StoryBoardTest.TestViewController: VC4> init
<StoryBoardTest.TestViewController: VC4> View did load
<StoryBoardTest.TestViewController: VC4> View did appear
<StoryBoardTest.TestViewController: VC3> View did disappear
<StoryBoardTest.TestViewController: VC5> init
<StoryBoardTest.TestViewController: VC5> View did load
<StoryBoardTest.TestViewController: VC5> View did appear
<StoryBoardTest.TestViewController: VC4> View did disappear
<StoryBoardTest.TestViewController: VC6> init
<StoryBoardTest.TestViewController: VC6> View did load
<StoryBoardTest.TestViewController: VC6> View did appear
<StoryBoardTest.TestViewController: VC5> View did disappear
<StoryBoardTest.TestViewController: VC7> init
<StoryBoardTest.TestViewController: VC7> View did load
<StoryBoardTest.TestViewController: VC7> View did appear
<StoryBoardTest.TestViewController: VC6> View did disappear
This seems like what I would expect if I had these embedded in a NavigationController, but I dont. Can someone shine some light onto why this do not deinit? And as a bonus, how would it differ if this was in a NavigationController.
The VC class:
import UIKit
class TestViewController: UIViewController {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("\(self.description) init")
}
deinit {
print("\(self.description) deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
print("\(self.description) View did load")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("\(self.description) View did appear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("\(self.description) View did disappear")
}
}