UIViewController阻止视图卸载

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

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

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

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

提前致谢


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

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

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


什么似乎为我工作是重写setView:忽略设置为零。 这很糟糕,但是,这是一个令人头痛的问题,而且这个技巧还有诀窍:

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

根据文档,didReceiveMemoryWarning的默认实现:释放视图,如果它是安全的(即:superview == nil)。

为了防止视图被释放,你可以重写didReceiveMemoryWarning:但是在你的实现中不要调用[super didReceiveMemoryWarning] 。 这就是视图默认释放的地方(如果不可见)。

[viewcontroller setView:nil]默认通过调用[viewcontroller setView:nil]释放视图,所以你可以改写它。


它可以如此简单吗?

尽管在文档中没有提到这一点,但似乎如果我完全保留viewDidLoad中的视图,那么它不会在内存警告中释放。 我在模拟器中尝试了几次连续的警告,而且所有警告看起来都不错。

所以......目前的技巧是在viewDidLoad中“保留”,并在dealloc中发布一个版本 - 这样viewcontroller就会与视图“卡在一起”,直到它需要被释放。

我会再测试一下,并写下结果

链接地址: http://www.djcxy.com/p/58349.html

上一篇: UIViewController prevent view from unloading

下一篇: Detect file content changes from node.js