iPhone - 如何处理内存不足的情况
Posted
技术标签:
【中文标题】iPhone - 如何处理内存不足的情况【英文标题】:iPhone - How to deal with low memory conditions 【发布时间】:2012-01-22 13:49:23 【问题描述】:当应用收到内存不足警告消息时,可能会发生 3 种情况:
-
您的应用刚刚启动,用户没有做任何特别的事情
应用正在运行并且存在当前上下文
应用在后台运行,有一些运行上下文
因此,当您收到此消息时,您应该释放内存...但是在哪里?以及如何?
我明白了:
initWith
..... 必须设置默认静态值。
viewDidLoad
必须加载任何非静态对象
didReceiveMemoryWarning
必须释放那些非静态对象
我看不出在viewDidUnload
中可以/必须做什么...
我猜某些保留值必须在某处设置为零...在 didReceiveMemoryWarning 中?
并且必须对活动上下文(屏幕的位置,显示的文本,...)做些什么,所以当再次调用 viewDidLoad 时,这些东西会再次出现在 memoryWarning 调用之前的位置?
我的意思是,想象两种情况:
场景 1
-
您正在处理某事...您在字段中写了一些文本,但没有保存,打开了另一个视图,在屏幕上移动了一个视图。
您在后台发送应用程序。
然后将 memoryWarning 发送到应用程序。
之后,用户将应用程序发送到前台:它应该在当前视图上显示退出时的内容,就像在以前的视图上一样,但如果所有内容都已发布,您该怎么做?
场景 2
-
您正在处理某事...您在字段中写了一些文本,但没有保存,打开了另一个视图,在屏幕上移动了一个视图。
然后将 memoryWarning 发送到应用程序。
您不想丢失视图中的内容,也不想丢失先前视图中的内容。您不希望屏幕因为释放/重新加载功能而闪烁。您如何处理?
所以当这些内存警告发生时,除了将内容写入磁盘以稍后显示它们之外,您还有其他选择吗?
你什么时候再加载这些?我有一个加载(viewDidLoad)的viewController,接收一个memoryWarning,卸载(viewDidUnload),但是当回到它时,不会再次调用viewDidLoad?这必须在 viewWillAppear 中完成吗?我是否必须认为,只要 viewWillAppear 被触发,我就可以假设应该在其上显示的内容已加载?
任何帮助,即使是有价值的链接,都会很棒!
感谢您的帮助。
【问题讨论】:
【参考方案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:如果您关闭它或关闭它的一部分,您的应用将变得无法使用并且用户会感到失望。
关于您的两种情况,我认为在考虑内存警告的用途时可能存在错误。 它们是一种处理紧急情况的方法,而不是管理记忆的正常方法。 开发者必须想出一个好的内存架构并尽可能保存数据。
在场景 1 中,将应用发送到后台时保存您的数据。
applicationDidEnterBackground
在场景 2 中,在打开新视图时保存数据。
希望这是有道理的......
【讨论】:
【参考方案2】:考虑您的方案的替代方案。如果你的应用程序没有释放足够的内存,它可能会被杀死,这对用户来说更加不和谐。与丢失用户的宝贵数据相比,人们可能会选择让当前显示闪烁。
【讨论】:
在我的情况下,最好让应用程序在闪烁时被杀死。我没有用户数据,但 ap 生成的内容。这些内容丢失是一件更好的事情,而不是以一种不顺畅的方式生成。以上是关于iPhone - 如何处理内存不足的情况的主要内容,如果未能解决你的问题,请参考以下文章