我对内存管理和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)
,但我的应用程序崩溃了。
我在这里错过了什么吗?
当ViewControllers
为navigationController
时取消初始化的popped
在以编程方式执行segue
时也不会取消初始化。
有人可以告诉我我做错了什么吗?
谢谢。
答案 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
。
希望对您有帮助。