管理内存使用情况VIewController Stack

时间:2015-10-02 16:39:01

标签: ios objective-c swift

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

以下是我如何创建每个实例:

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

如何管理内存利用率?

2 个答案:

答案 0 :(得分:7)

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

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

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

这需要你自己做大量的定制工作,但不应该那么难。

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

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

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

答案 1 :(得分:1)

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

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