如何在不出现内存泄漏的情况下实现视图控制器的重复工作流程?

问题描述 投票:0回答:1

NavigationController
中,我有一个由三个视图控制器组成的工作流程:A -> B -> C。每次完成一个工作流程,就会开始一个新的工作流程,因此 A -> B -> C -> A -> B .... 现在,我只需
performSegue
从一个视图控制器转到下一个视图控制器。这“工作”完美,除了所有先前的视图控制器保留在导航堆栈上,有效地泄漏内存。

用户可以按返回键返回特定工作流程中的上一个控制器,但他们永远不需要返回到上一个工作流程。 IE。它们可以从 B 返回到 A,但不能从 A 返回到之前的 C。因此,似乎我可以在启动新工作流程时通过丢弃先前工作流程中的所有视图控制器来修复泄漏。

我尝试使用 C 的

navigationController?.viewControllers = []
中的
prepare(for segue...
来执行此操作,但所有视图控制器仍保留在内存图中。在内存图中,问题似乎是从
_childModalViewController
到第一个
UINavigationController
到第一个
A
到第一个
B
到第二个
C
等等的
A
链。

似乎

navigationController?.viewControllers = []
不是正确的方法,或者我需要做进一步的事情,以便导航控制器不会通过
_childModalViewController
返回以前的视图控制器。我已经尝试了很多变体,
popToRootViewController
removeFromParent
willMove(toParent: nil)
dismiss
等,但没有发现任何影响导航控制器的
_childModalViewController
。关于实施重复工作流程的正确方法有什么建议吗?

ios swift memory-leaks uinavigationcontroller
1个回答
0
投票

After从C转到A,将导航控制器的视图控制器设置为相同的A实例(现在是导航控制器的顶视图控制器)。这将从视图控制器层次结构中无形地删除以前的 A、B 和 C,并且它们将不复存在。

我让你来决定如何知道什么时候是正确的时机。例如,您可以在 A 的

viewDidAppear
中执行此操作,但(当然)仅在调用此 A 实例的 viewDidAppear
first
时。但还有很多其他方法可以获得正确的时机。

© www.soinside.com 2019 - 2024. All rights reserved.