当应用收到内存不足警告消息时,可能会发生以下三种情况:
所以当你收到这条消息时,你应该释放记忆......但是在哪里?怎么样?
我理解:
initWith
.....必须设置默认静态值。 viewDidLoad
必须加载任何非静态对象didReceiveMemoryWarning
必须释放这些非静态对象viewDidUnload
... 我想某些保留值必须设置为nil某处...在didReceiveMemoryWarning中?
对于活动上下文(屏幕内容,显示的文本,......)必须做些什么,所以当再次调用viewDidLoad时,那些东西会再次出现在memoryWarning调用之前的位置?
我的意思是,想象两个场景:
情景1
场景2
因此,当发生这些内存警告时,除了将内容写入磁盘以便稍后显示之外,您还有其他选择吗?
你什么时候再装这些?我有一个viewController加载(viewDidLoad),接收一个memoryWarning,unloads(viewDidUnload),但回到它时,viewDidLoad不再被调用?这是否必须在viewWillAppear中完成?我是否必须认为无论何时触发viewWillAppear,我都可以假设应该在其上显示的内容被加载?
任何帮助,即使有价值的链接,都会很棒!
感谢您的帮助。
答案 0 :(得分:1)
我的想法是,当应用收到内存不足警告时会调用两个方法:
didReceiveMemoryWarning // in your NSObjects
和
applicationDidReceiveMemoryWarning // in your app delegate
然后,如果你想释放内存,这些是需要考虑的方法。
关于你在那里可以做些什么......好吧...... 想想Xcode建议的内容:
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
/*
Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
*/
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
看起来,最好的选择是释放用户未看到和/或未使用的任何对象,或者以后可以重新创建的任何缓存数据。 不要触摸您的GUI:如果您关闭它或部分GUI,您的应用程序将变得无法使用,并且用户会感到失望。
关于你的2个场景,我发现在考虑内存警告时可能存在错误。 它们是一种治疗紧急情况的方式,而不是管理记忆的常用方法。 开发人员必须考虑良好的内存架构并尽可能保存数据。
在方案1中,将应用程序发送到后台时保存数据。
applicationDidEnterBackground
在方案2中,在打开新视图时保存数据。
希望这是有道理的......
答案 1 :(得分:1)
考虑您的方案的替代方案。如果它没有释放足够的内存,你的应用程序可能会被杀死,这对用户来说会更加不和谐。人们可能会选择潜在的闪烁当前显示而不是丢失用户的宝贵数据。