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