我是内存管理和弧的整个概念的新事物。
我最近调查了它并发现了混乱的成功。
首先,应该注意的是,某些 ViewController
do Deinitialize,但我仍在学习和清理我的应用程序。
但是,我注意到的一个常见模式是,当我使用该行navigationController?.popViewController(animated: true)
时,如果没有强引用,则会在deinit
A View Controller中进行Infact Infact a View Controller。
但是,我的问题是,当我使用segue并使用performSegue(withIdentifier: "showDetail_Segue", sender: nil)
时,deinit
方法从未使用/调用。(我只有一个打印声明来指示是否已降低了视图(。在大多数情况下,当我执行segue时,我将数据传递到另一个视图控制器,因此,我使用以下功能override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}
。
我试图将我的segue更改为 navigationController?.pushViewController(VC, animated: true)
,但我的应用程序崩溃了。
我在这里错过了什么吗?
当navigationController
为popped
时,Deinitliaze的ViewControllers
在以编程性执行segue
时也不会脱氧。
有人可以告诉我我做错了什么吗?
谢谢。
好吧,如果我正确理解您,您可能会误会对赛格的工作方式
segues不能用于返回到堆栈中的以前的ViewController
这很重要。如果您使用segues作为返回的方式而不是使用 popViewController
,则创建了一个新实例,您可以返回到返回到deinit
,因为ViewController仍在存储器中。
本质上,类似此列表的内容 ->详细信息 ->列表,您刚刚与SEGUE创建了列表的另一个实例。
呼叫performSegue
时,此segue是推送到另一个VC的推动,您正在创建VC的新实例,但是导航堆栈仍然是相同的,您只会将VC添加到堆栈中。
记住:
堆栈:[root,vc1,vc2]
vc2.performsegue(push(
堆栈:[root,vc1,vc2,vc3]
当您解散VC时,该类仅致电denit
。
我希望这对您有帮助。