gpt4 book ai didi

iPhone - 如何处理内存不足的情况

转载 作者:行者123 更新时间:2023-12-03 21:04:14 26 4
gpt4 key购买 nike

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

  1. 您的应用刚刚启动,用户没有执行任何特殊操作
  2. 应用正在运行并且有当前上下文
  3. 应用程序在后台运行,并有一些运行上下文

所以当你收到这条消息时,你应该释放内存......但是在哪里?又如何?

我明白:

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

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

必须对事件上下文(屏幕上的事物的位置、显示的文本等)执行哪些操作,以便再次调用 viewDidLoad 时,这些事物会再次出现在调用 memoryWarning 之前的位置?

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

场景 1

  1. 您正在处理某事...您在字段中写入了一些文本,但未保存它,打开了另一个 View ,在屏幕上移动了 View 。
  2. 您在后台发送应用。
  3. 然后,内存警告会发送到应用。
  4. 之后,用户将应用程序发送到前台:它应该在当前 View 上和之前的 View 上一样显示退出时的内容,但如果所有内容都已发布,您会如何执行此操作?

场景 2

  1. 您正在处理某事...您在字段中写入了一些文本,但未保存它,打开了另一个 View ,在屏幕上移动了 View 。
  2. 然后,内存警告会发送到应用。
  3. 您不想丢失 View 上的内容,也不想丢失上一个 View 上的内容。您不希望屏幕因释放/重新加载功能而闪烁。您如何处理这个问题?

因此,当发生这些内存警告时,除了将内容写入磁盘以便稍后显示出来之外,您还有其他选择吗?

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

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

感谢您的帮助。

最佳答案

我的想法是,当应用程序收到内存不足警告时,会调用两个方法:

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

希望这是有道理的......

关于iPhone - 如何处理内存不足的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com