UIViewController阻止视图卸载

Mar*_*rov 16 cocoa-touch memory-management uiviewcontroller uiview ios

当我的iPhone应用程序收到内存警告时,当前不可见的UIViewControllers的视图将被卸载.在一个特定的控制器中,卸载视图和插座是相当致命的.

我正在寻找一种方法来防止这个视图被卸载.我发现这个行为相当愚蠢 - 我有一个缓存机制,所以当一个内存警告来临时 - 我卸载了大量的数据并且我释放了足够的内存,但我绝对需要这个视图不受影响.

我看到UIViewController有一个方法unloadViewIfReloadable,当内存警告到来时会调用它.有人知道如何告诉Cocoa Touch我的视图无法重新加载吗?

任何其他建议如何防止我的视图被卸载内存警告?

提前致谢


关于视图控制器的视图生命周期的Apple文档说:

didReceiveMemoryWarning - 默认实现仅在确定视图安全时才释放视图

现在......我didReceiveMemoryWarning用一个只调用NSLog的空函数覆盖它,让我知道收到了一个警告.但是 - 无论如何都要卸载视图.另外,根据什么标准确定视图是否可以安全卸载......哦!这么多的问题!

pro*_*rmr 15

根据文档,didReceiveMemoryWarning的默认实现:如果可以安全地发布视图(即:superview == nil).

要阻止视图被释放,您可以覆盖didReceiveMemoryWarning:但在您的实现中不要调用 [super didReceiveMemoryWarning].这是默认情况下释放视图的位置(如果不可见).

默认的didReceiveMemoryWarning通过调用释放视图[viewcontroller setView:nil],因此您可以改写它.


umo*_*mop 13

似乎对我有用的是覆盖setView:忽略设置为零.它很笨拙,但是,这是一个麻烦的问题,这就是诀窍:

-(void)setView:(UIView*)view {
    if(view != nil || self.okayToUnloadView) {
        [super setView:view];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你能否详细介绍一下你对`self.okayToUnloadView`的使用? (4认同)