如何在 UINavigationController 堆栈中使用 didReceiveMemoryWarning

Posted

技术标签:

【中文标题】如何在 UINavigationController 堆栈中使用 didReceiveMemoryWarning【英文标题】:How to use didReceiveMemoryWarning in UINavigationController stack 【发布时间】:2011-07-16 16:53:53 【问题描述】:

我的应用在堆栈中有多个 UIViewController(在 UINavigationController 下)。在某些情况下,当我在内部 UIViewControllers 中时,我会收到内存警告(通常在设备因后台运行的其他应用程序而过载时发生)。当这些内存警告发生时,应用程序会继续运行(大多数情况下),然后当它返回到 rootViewController 时,它会重新加载它,但不会填充视图对象(主要是 UIButton 图像)。

我希望实现didReceiveMemoryWarningapplicationDidReceiveMemoryWarning,但我不清楚如何实现。

我正在寻找的最终结果是,当应用程序在内存警告后执行此“重新加载”时,它将“重新加载”rootViewController,处于与用户开始“潜入”内部 UIViewControllers 之前相同的状态。

应该如何实现? 我应该在每个 UIViewController 中实现默认的didReceiveMemoryWarning 吗? 由于内存警告总是发生在内部 UIViewControllers 中,我应该如何让 rootViewController 知道它应该运行 didReceiveMemoryWarning? 我如何告诉rootViewController 它应该进行哪些设置?换句话说 - 我可以将设置保留在 didReceiveMemoryWarning 不会删除它们的地方,并在激活 didReceiveMemoryWarning 时“召回”它们,以便用户看到他们开始“关卡导航”的屏幕吗?

【问题讨论】:

【参考方案1】:

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

根(另一个)控制器应该适当地处理viewDidUnload,并且能够循环通过另一个loadView/viewDidLoad 阶段。

如果您希望状态相同,则需要保留所有这些信息。 NSUserDefaults 是执行此操作的标准位置。

【讨论】:

1.那么您对 ​​UINavigationController 堆栈的看法是,当我在堆栈的第三个视图中时,系统会转储第二个视图? 2.我应该如何在根视图中执行? didReceiveMemoryWarning 的出发点是什么?我应该从 didReceiveMemoryWarning 中调用 loadView 吗? 1.是的。 2.绝对不要从didReceive…调用loadView,你不应该调用loadView,只执行它。根视图控制器只是堆栈上的另一个视图控制器 好的,知道了。还有一件事,如果我想在 didReceiveMemoryWarning 生效之前(即在它调用 viewDidLoad 之前)保存一些数据,那么应用程序将使用它在内存警告发生之前保存的数据重新加载根视图。知道怎么做吗? 通常使用NSUserDefaults 来存储表格视图滚动到的位置和/或其选择的位置,当您收到viewDidLoad 时,您可以重置该状态

以上是关于如何在 UINavigationController 堆栈中使用 didReceiveMemoryWarning的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 中设置时图像不显示

将 managedObjectContext 发送到 viewController 崩溃

ID:[...] 的 NSManagedObject 已失效

使用 UINavigationController 从另一个控制器更新或重新加载 UIViewController?

为啥我似乎必须在 iOS 应用程序委托中键入 window.rootViewController?

UINavigationController - 何时释放推送的视图控制器等