我创建了两个视图控制器,每个控制器都有一个按钮,可以显示另一个视图控制器。
var counter = 0
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
counter += 1
print("init viewc \(counter)")
}
deinit {
counter -= 1
print("deinit viewc \(counter)")
}
}
似乎从未调用过deinit,每次返回ViewController时,计数器都在增加:
init viewc 1
init viewc 2
init viewc 3
等等......我在这里错过了什么吗?我认为show segue应该从内存中释放调用者,因为它不再需要。我现在每次都要创建新的ViewController对象吗?
答案 0 :(得分:1)
由于您使用的是“show”segue,因此每次都会创建一个新的视图控制器实例,从而有效地呈现顶级视图控制器的“堆栈”。
如果要在视图控制器的单个实例之间前后切换,则可以使用容器视图控制器,例如UITabBarController
或使用UINavigationController
并操纵viewControllers
属性
答案 1 :(得分:0)
如果您要放开要保留的视图控制器之前的视图控制器,并且您不打算做unwind segue
并返回到先前的view controller
最新状态,并且您想取消分配先前的视图控制器,则实际上是将一个较晚的视图控制器视为新的rootViewController
,直到在AppDelegate
上重新分配根视图控制器属性为止由于rootViewController
对其有很强的引用,因此不会释放第一视图控制器。
UIApplication.shared.keyWindow?.rootViewController = VCTwo