首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >didReceiveMemoryWarning和viewDidUnload

didReceiveMemoryWarning和viewDidUnload
EN

Stack Overflow用户
提问于 2010-12-04 15:44:41
回答 2查看 5.1K关注 0票数 11

从苹果的观点,控制器编程指南/内存的有效管理;

didReceiveMemoryWarning

使用此方法可以释放与视图控制器关联的所有非关键自定义数据结构。虽然您不会使用此方法来释放对视图对象的引用,但是您可以使用它来释放在viewDidUnload方法中尚未发布的任何与视图相关的数据结构。(视图对象本身应该始终在viewDidUnload方法中释放。)

viewDidUnload

您可以使用viewDidUnload方法来释放任何特定于视图的数据,如果视图再次加载到内存中,这些数据可以很容易地重新创建。不过,如果重新创建数据可能太费时,则不必在此处释放相应的数据对象。相反,您应该考虑在didReceiveMemoryWarning方法中释放这些对象。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html

  1. For didReceiveMemoryWarning,我们建议解除非关键数据结构。那么,什么是关键,什么是non-critical?

  1. 也说要发布我们还没有在viewDidUnload中发布的内容。但是,当存在内存警告时,调用didReceiveMemoryWarning并可以卸载视图,则调用viewDidUnload。那么,它是在谈论将这些代码移动到前一个事件的方法(DidReceiveMemoryWarning),还是我忽略了事件的顺序?

  1. For viewDidUnload,我们建议您在重新加载视图时轻松地重新创建数据。那么,如果一个视图正在使用并且无法卸载,我们为什么要在didReceiveMemoryWarning中发布耗时的数据呢?在这些数据发布后,当用户试图在当前视图中执行某些操作时,加载这些数据也是很费时的。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-04 16:06:14

首先,这些只是指南,所以如果您不认为在didReceiveMemoryWarning中发布某些内容是很有意义的,那么就不要这么做。但是请记住,如果您的应用程序是首先导致内存警告的应用程序,那么它最终将被操作系统终止。

评论(1):批判性和非关键性完全是你的决定。只有你才能真正确定你持有哪些你认为重要的数据。尽管它可能与您的(3)密切相关,也就是说,容易重新创建的东西可能并不太重要。

Re (2):我不认为这句话指的是呼叫的顺序。正如您已经意识到的,通常情况下,viewDidUnload将在didReceiveMemoryWarning之后被调用(因为didReceiveMemoryWarning可以导致调用viewDidUnload )。例如,在viewDidUnload中,可以从一个nib中释放对UI元素的引用。所以也不要在didReceiveMemoryWarning中发布它们。

Re (3):如果视图正在使用,因此无法卸载,那么是的,显然在didReceiveMemoryWarning中发布它并不一定很有意义。但是,您实际上可能有一些视图无法卸载,但已知是不可见(不是非常正常)的实例,在这种情况下,卸载它的数据并在视图再次可见时重新创建它可能是有意义的。

此外,我同意“相反,你应该考虑.”评论有点奇怪,但我认为在didReceiveMemoryWarning中发布这些数据的意义在于,如果您收到了这些警告,那么您自己的应用程序可能会面临被终止的危险。因此,虽然当前的情况是,viewDidUnload可能总是作为内存警告的结果被调用,但在将来可能并不总是如此,因此从概念上讲,在didReceiveMemoryWarning本身中释放数据更有意义。在didReceiveMemoryWarning中,您知道存在内存压力,而在viewDidUnload中,您可能不知道。因此,尽管重新创建数据的代价确实很高,但这可能比终止应用程序更好。对用户来说,它看起来就像应用程序崩溃了一样。

我个人对这些方法的看法一般如下:

  • viewDidUnload -释放对从nib加载的UI元素的任何引用。释放我自己在viewDidLoad.
  • didReceiveMemoryWarning中创建的任何UI元素--释放UI表示中使用的任何数据,如果/何时再次调用viewDidLoad (或其他特定于应用程序的事件),则可以重新创建这些数据。不要发布任何我无法重新创建的内容。
票数 16
EN

Stack Overflow用户

发布于 2010-12-06 17:58:43

我正在构建的应用程序是图形密集型的,无论是在布局上,还是在与我正在下载和显示的数据相关的图像中。

我的didReceiveMemoryWarning方法都是确定哪些图像保存在内存中,但目前没有显示,并将它们从内存中删除。另一种情况是,在显示图像之前,您需要检查它是否还在附近,如果没有,则需要延迟加载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4354332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档