【问题标题】:Managing Memory Usage VIewController Stack管理内存使用 VIewController 堆栈
【发布时间】:2015-10-02 16:39:01
【问题描述】:

我注意到,当打开一个视图的多个实例时,我的记忆会随着用户打开的视图越多而不断攀升。如果用户开始回击,则每个视图控制器关闭时内存使用量都会下降。但是,根据用户在做什么,他可以打开 20 多个视图控制器,我该如何管理内存利用率?请记住,我需要在后台加载所有这些视图,以便在用户回击时快速加载它们

以下是我创建每个实例的方式:

let storyboard = UIStoryboard(name: "Storyboard", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("FriendPage") as! FriendVC
self.navigationController!.pushViewController(vc, animated:false)

如何管理内存利用率?

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    导航堆栈将所有视图控制器都加载到内存中。这是其工作方式不可或缺的一部分。

    正如 Beardsley 先生所说,您可以设置视图控制器以在 viewDidDisappear 方法中释放其大型数据结构(包括将图像视图设置为 nil),然后在 viewWillAppear 中重新加载它们。如果您确保所有内容都缓存到磁盘,它应该会快速重新加载。

    除此之外,您需要放弃导航控制器并创建自己的父视图控制器,以显示一系列子视图控制器。您可以让父级跟踪用户遵循的导航路径并将每个视图控制器的状态数据保存到磁盘,然后在用户按下后退按钮时,重新调用前一个视图控制器并从它保存的状态数据中重构它.只要所有内容都是从磁盘加载而不是从网络加载,当用户按下返回按钮时,您应该能够获得几乎即时显示的每个屏幕。

    这需要您进行大量的自定义工作,但应该不会那么难。

    有诸如“transitionFromViewController:toViewController:duration:options:animations:completion:”之类的方法可以让您在子视图控制器之间创建自定义转换。您应该能够轻松创建所需的任何过渡效果。

    通过保存用户访问的视图控制器列表和从磁盘重新创建每个视图控制器所需的状态数据块,您应该能够模拟导航堆栈,同时只有一个子视图控制器处于活动状态并在内存中一次。

    不过,在走这条路之前,我建议先看看您的用户界面,看看是否有办法限制用户可以导航的深度。您可以为用户导航的深度添加某种限制。具体细节取决于您的应用设计。

    【讨论】:

      【解决方案2】:

      除非您遇到内存压力问题,否则我不会担心。当您在视图控制器中导航 20 个级别时,您的内存使用量增长了多少?如果遇到问题,则必须将以前的视图控制器的状态保存到持久存储中,然后将当前视图控制器设置为根。当您返回时,您必须重新实例化视图控制器并恢复状态。

      中间的方法可能是让视图控制器在将新控制器添加到堆栈时释放任何图像或其他大型二进制数据。当您导航回来时,视图控制器将不得不从磁盘或网络重新加载数据。

      【讨论】:

      • 你能举个例子吗?
      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 2020-10-10
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2015-09-28
      • 1970-01-01
      相关资源
      最近更新 更多