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 - 如何处理内存不足的情况的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“内存不足”的问题

手机内存总是提示不足的解决方法

服务器存储空间不足无法处理此命令

Redis 内存不足时会做啥?

java上打开一个游戏显示java异常退出,内存不足,是怎么回事

蜡炬教育:如何处理机器学习中大型数据的加载问题?