在我的应用中,我有一个带有四个控制器的导航控制器。用户从A -> B -> C -> D -> A_1 -> B_2 ->
...等导航。这是一种方法,每个ViewController
始终是新的ViewController
。
此循环是预期的。但是在ViewController A
和C
中,我初始化了GoogleMaps
,它占用了大量内存。因此,经过15次循环(和30次GoogleMap初始化)后,我的应用由于内存泄漏而崩溃了。
现在,我看到解决此问题的不同可能性。
1)我没有初始化新的ViewController,而是重用了VC。因此,Google Maps只会初始化两次。 我不喜欢这样,因为我的VC可能具有不同的状态。干净的初始化会更舒适,并且错误源更少
2)我在正确的时间删除堆栈,因为导航只是一种方式。从A -> B
过渡完成后,我可以扔掉A。 C -> D
也是如此。
3)我在过渡后取消了Google地图的初始化。我还不知道该怎么做,但是我很确定我会解决的。
我了解了setViewControllers,可以用来替换视图控制器。
最佳做法是什么?苹果有什么建议?
答案 0 :(得分:0)
从第三个最简单的选项开始:
使用override func viewWillDisappear(){}
取消初始化Google地图。您也可以将此方法用于第二个选项。
但是我认为,当您从D返回A时,应该使用委托。当再次到达A时,您对A会有什么改变?
答案 1 :(得分:0)
您提到导航只是一种方法。如果是这样,您只需替换UINavigationController
的{{1}}数组即可。换句话说,如果用户不向后退,则可能不需要导航堆栈。
或者,我的应用中遇到了类似的问题。当我在viewControllers
中推入控制器时,它将检查现有的UINavigationController
并对其进行修改。例如,如果已经有一个相同的控制器,则弹出该副本。
答案 2 :(得分:0)
您可以使用两种方法从A-> B-> C-> D-> A_1-> B_2-> ...等导航视图控制器。
方法1: 当您要使用D控制器时,请跳至特定的控制器(A控制器),然后再次使用推视图控制器在循环A到D之间导航。
self.navigationController?.popToViewController(A, animated: true)
方法2: 当您要使用D控制器时,当您再次到达D控制器时,请使用当前控制器(A控制器)并取消显示的循环流
viewController.present(A, animated:true, completion: nil)