1

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

我最近研究了它,发现成功参半。

首先应该注意的是,有些 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取消初始化。navigationControllerpoppedsegue

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

谢谢你。

4

2 回答 2

1

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

记住:

堆栈:[根,vc1,vc2]

vc2.performSegue(推送)

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

该类仅denit在您解雇 VC 时调用。

我希望这可以帮助你。

于 2019-05-27T17:06:01.487 回答
1

好吧,如果我理解正确的话,你可能对 segues 的工作方式有误解

Segues 不能用于返回堆栈中的前一个 viewController

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

本质上,类似这样的列表 -> 详细信息 -> 列表,您刚刚使用 segue 创建了列表的另一个实例。

于 2019-05-27T16:03:01.933 回答