Swift-执行segue后,Viewcontroller不会取消初始化

时间:2019-05-27 15:35:46

标签: ios swift automatic-ref-counting deinit

我对内存管理和ARC的整个概念还很陌生。

我最近对其进行了研究,并发现喜忧参半。

首先应该注意, some ViewController确实会初始化,但是我仍在学习和清理我的应用程序。

但是,我注意到的一个常见模式是,当我使用行navigationController?.popViewController(animated: true)时,如果没有强引用,这确实会deinit一个视图控制器。

但是,我的问题是,当我使用segue并使用performSegue(withIdentifier: "showDetail_Segue", sender: nil)时,永远不会使用/调用deinit方法。 (我只有一个打印语句,以表明视图是否已取消初始化)。在大多数情况下,当我执行segue时,我会将数据传递给另一个视图控制器,结果,我使用了以下函数override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}

我尝试将Segue更改为navigationController?.pushViewController(VC, animated: true),但我的应用程序崩溃了。

我在这里错过了什么吗?

ViewControllersnavigationController时取消初始化的popped在以编程方式执行segue时也不会取消初始化。

有人可以告诉我我做错了什么吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

好的,如果我对您的理解正确,那么您可能会对segue的工作方式产生误解

不能使用Segues返回堆栈中的上一个viewController

这很重要。如果您使用segues作为回退的方式而不是使用popViewController,那么您将创建一个要返回的viewController的新实例,因此,由于viewController仍在内存中,因此永远不会调用deinit。 / p>

本质上,类似此列表->详细信息->列表的地方,您刚刚在其中使用segue创建了列表的另一个实例。

答案 1 :(得分:0)

调用performSegue时,这是对另一个VC的推送,您正在创建VC的新实例,但是导航堆栈仍然相同,仅将VC添加到堆栈中。

记住:

堆栈:[root,vc1,vc2]

vc2.performSegue(推送)

堆栈:[root,vc1,vc2,vc3]

该类仅在您关闭VC时才调用denit

希望对您有帮助。