如何在UINavigationController堆栈中使用didReceiveMemoryWarning

3
我的应用程序在导航控制器下有多个UIViewControllers。在某些情况下,当我在内部UIViewControllers中时会收到内存警告(大多发生在设备过载的情况下,其他应用程序在后台运行)。当这些内存警告发生时,应用程序继续运行(大多数情况下),然后当它回到rootViewController时重新加载它,但不填充视图对象(主要是UIButton图像)。
我希望实现didReceiveMemoryWarningapplicationDidReceiveMemoryWarning,但我不清楚如何做到这一点。
我想要的最终结果是,当应用程序在内存警告后进行“重新加载”时,它将以与用户开始“深入”内部UIViewControllers之前相同的状态“重新加载”rootViewController
问题如下:
  • 我应该如何实现?
  • 我应该在每个UIViewController中实现默认的didReceiveMemoryWarning吗?
  • 由于内存警告总是发生在内部UIViewControllers中,我应该如何让rootViewController知道它应该运行didReceiveMemoryWarning
  • 我如何告诉rootViewController应该进行哪些设置?换句话说,我可以在didReceiveMemoryWarning不删除它们的地方保留设置,并在激活didReceiveMemoryWarning时“调用”它们,以便用户将看到他们从“级别导航”开始的相同屏幕吗?
1个回答

3

UINavigationController栈上的任何不可见视图控制器都将卸载其视图。它还会向您发送警告。如果您的视图控制器保存有大型数据结构,则应尽可能卸载这些数据。

根(和其他)控制器应适当处理viewDidUnload并能够循环执行另一个loadView/viewDidLoad阶段。

如果要保持状态相同,则需要持久化所有信息。NSUserDefaults是执行此操作的标准位置。


你的意思是关于UINavigationController堆栈,当我在堆栈的第三个视图中时,系统会删除第二个视图? - Ohad Regev
  1. 在根视图中,我应该如何进行实现?我的didReceiveMemoryWarning的起点是什么?我是否应该在didReceiveMemoryWarning中调用loadView?
- Ohad Regev
  1. 是的。
  2. 绝对不要在 didReceive… 中调用 loadView,你永远不应该调用 loadView,只需实现它。根视图控制器只是堆栈中的另一个视图控制器。
- bshirley
好的,明白了。还有一件事,如果我想在didReceiveMemoryWarning生效之前(即在它调用viewDidLoad之前)保存一些数据,以便应用程序在内存警告发生之前重新加载根视图并使用其保存的数据。你有什么想法吗? - Ohad Regev
通常使用 NSUserDefaults 存储诸如表视图滚动到何处以及/或其选择等内容。当您收到 viewDidLoad 时,可以重置该状态。 - bshirley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接