2

当应用程序收到内存不足警告消息时,可能会发生 3 种情况:

  1. 您的应用刚刚启动,用户没有做任何特别的事情
  2. 应用程序正在运行并且存在当前上下文
  3. 该应用程序在后台运行一些上下文

因此,当您收到此消息时,您应该释放内存...但是在哪里?如何 ?

我明白那个 :

  1. initWith.....必须设置默认的静态值。
  2. viewDidLoad必须加载任何非静态对象
  3. didReceiveMemoryWarning必须释放那些非静态对象
  4. 我看不出在viewDidUnload...中可以/必须做什么

我猜某些保留值必须在某处设置为零……在 didReceiveMemoryWarning 中?

并且必须对活动上下文(屏幕的位置,显示的文本,...)做些什么,所以当再次调用 viewDidLoad 时,这些东西会再次出现在 memoryWarning 调用之前的位置?

我的意思是,想象两种情况:

方案 1

  1. 你正在做某事……你在一个字段中写了一些文本,没有保存它,打开另一个视图,在屏幕上移动了一个视图。
  2. 您在后台发送应用程序。
  3. 然后将 memoryWarning 发送到应用程序。
  4. 之后,用户将应用程序发送到前台:它应该显示他们在退出时的内容,在当前视图上和以前的视图上一样,但是如果所有内容都已发布,你该怎么做?

方案 2

  1. 你正在做某事……你在一个字段中写了一些文本,没有保存它,打开另一个视图,在屏幕上移动了一个视图。
  2. 然后将 memoryWarning 发送到应用程序。
  3. 您不想丢失视图中的内容,也不想丢失先前视图中的内容。您不希望屏幕因为释放/重新加载功能而闪烁。你怎么处理这个?

那么当这些内存警告发生时,除了将内容写入磁盘以稍后显示它们之外,您还有其他选择吗?

你什么时候再加载这些?我有一个加载(viewDidLoad)的viewController,接收一个memoryWarning,卸载(viewDidUnload),但是当回到它时,不会再次调用viewDidLoad?这必须在 viewWillAppear 中完成吗?我是否必须认为每当 viewWillAppear 被触发时,我可以假设应该在其上显示的内容已加载?

任何帮助,即使是有价值的链接,都会很棒!

谢谢您的帮助。

4

2 回答 2

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 中,在打开新视图时保存数据。

希望这是有道理的...

于 2012-01-22T14:42:19.880 回答
1

考虑您的方案的替代方案。如果你的应用程序没有释放足够的内存,它可能会被杀死,这对用户来说更加不和谐。人们可能会选择潜在地闪烁当前显示而不是丢失用户的有价值数据。

于 2012-01-22T19:16:38.513 回答