代码之家  ›  专栏  ›  技术社区  ›  kuzdu

NavigationController中的循环-如何避免内存泄漏?

  •  2
  • kuzdu  · 技术社区  · 7 年前

    在我的应用程序中,我有一个带有四个控制器的导航控制器。用户从 A -> B -> C -> D -> A_1 -> B_2 -> ... 等等,这是单向的 ViewController 总是一个新的 视图控制器 .

    这个循环是有意的。但是在 ViewController A C 我初始化 GoogleMaps 这会占用大量内存。因此,在15次循环(以及谷歌地图的30次初始化)之后,我的应用程序因为内存泄漏而崩溃。

    现在我看到了解决这个问题的不同可能性。

    1) 我不初始化一个新的ViewController,而是重用我的VCs。所以谷歌地图只需要初始化两次。 我不喜欢这样,因为我的风投可能有不同的状态。一个干净的init会更舒适,错误源也会更小

    2) 我在正确的时间移除堆栈,因为导航只是一种方式。当从 A -> B 我可以扔掉一个。同样的道理 C -> D .

    3) 我会在转换后删除谷歌地图。我还不知道怎么做,但我很确定我会找到答案的。

    我读到 setViewControllers 我可以用它来替换视图控制器。

    最佳实践是什么?苹果有什么建议?

    3 回复  |  直到 7 年前
        1
  •  0
  •   Dris    7 年前

    从第三个也是最简单的选项开始:

    使用 override func viewWillDisappear(){} 去诋毁谷歌地图。你也可以在第二个选项中使用这种方法。

    但我认为,当你从D回到A时,你应该使用委托。当你再次到达A时,A上会发生什么变化?

        2
  •  0
  •   Pan Surakami    7 年前

    你提到导航只是一种方式。如果是这样的话,你可以换一个 UINavigationController 是的 viewControllers 大堆换句话说,如果用户不在堆栈中后退,则可能不需要导航堆栈。

    或者,我的应用程序中也出现了类似的问题。当我将控制器推入 导航控制器 它检查现有的 视图控制器 并对其进行修改。例如,如果已经存在相同的控制器,则弹出到该副本。

        3
  •  0
  •   AtulParmar    7 年前

    您可以从->导航视图控制器;B->C->D->A_1->B_2->。。。等等。使用两种方法。

    方法1: 当您要使用D控制器时,请弹出到特定的控制器(a控制器),然后再次使用push view控制器导航循环a到D。

    self.navigationController?.popToViewController(A, animated: true)
    

    方法2: 当您要进入D控制器时,请关闭当前控制器(A控制器),并在再次到达D控制器时关闭当前循环流

    viewController.present(A, animated:true, completion: nil)