我的viewcontroller在show segue之后没有被取消初始化

时间:2016-08-29 10:56:44

标签: ios swift uiviewcontroller

我创建了两个视图控制器,每个控制器都有一个按钮,可以显示另一个视图控制器。

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对象吗?

2 个答案:

答案 0 :(得分:1)

由于您使用的是“show”segue,因此每次都会创建一个新的视图控制器实例,从而有效地呈现顶级视图控制器的“堆栈”。

如果要在视图控制器的单个实例之间前后切换,则可以使用容器视图控制器,例如UITabBarController或使用UINavigationController并操纵viewControllers属性

答案 1 :(得分:0)

如果您要放开要保留的视图控制器之前的视图控制器,并且您不打算做unwind segue并返回到先前的view controller最新状态,并且您想取消分配先前的视图控制器,则实际上是将一个较晚的视图控制器视为新的rootViewController,直到在AppDelegate上重新分配根视图控制器属性为止由于rootViewController对其有很强的引用,因此不会释放第一视图控制器。

UIApplication.shared.keyWindow?.rootViewController = VCTwo