didReceiveMemoryWarning和viewDidUnload

loc*_*ope 11 iphone memory-management uiviewcontroller uiview

从Apple的View Controller编程指南/有效管理内存;

didReceiveMemoryWarning

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

viewDidUnload

您可以使用viewDidUnload方法释放视图特定的任何数据,并且如果视图再次加载到内存中,则可以轻松地重新创建.但是,如果重新创建数据可能过于耗时,则不必在此处释放相应的数据对象.相反,您应该考虑在didReceiveMemoryWarning方法中释放这些对象.

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

  1. 对于didReceiveMemoryWarning,我们建议取消分配非关键数据结构.那么,什么是关键的,什么是非关键的?

  2. 此外,它说要发布我们尚未在viewDidUnload中发布的内容.但是当存在内存警告时,调用didReceiveMemoryWarning并且可以卸载视图,然后调用viewDidUnload.那么,它是在谈论将这些代码移动到前一个事件的方法(didReceiveMemoryWarning)还是我错过了一些关于事件顺序的东西?

  3. 对于viewDidUnload,我们建议您在重新加载视图时轻松重新创建数据.因此,如果视图正在使用且无法卸载,为什么我们会在didReceiveMemoryWarning中释放耗时的数据?在发布这些数据之后,当用户尝试在当前视图中执行某些操作时,加载它们也将非常耗时.

ima*_*boy 16

首先,这些只是指导方针,所以如果你认为发布一些东西是不合理的,didReceiveMemoryWarning那么就不要这样做.但请记住,如果您的应用程序是首先导致内存警告的应用程序,那么它最终将由操作系统终止.

Re(1):关键与非关键完全是你的呼唤.只有您才能真正确定您认为关键的数据.虽然它可能与你的(3)密切相关,也就是说,容易重新创建的东西可能不是太关键.

Re(2):我不认为该陈述是关于调用的顺序.正如你已经意识到的那样,一般来说,viewDidUnload之后会被调用didReceiveMemoryWarning(因为didReceiveMemoryWarning可以导致viewDidUnload被调用).作为一个例子,在viewDidUnload一个将释放从笔尖持有UI元素的引用.所以不要也发布它们didReceiveMemoryWarning.

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

此外,我同意"相反,你应该考虑......"的评论有点奇怪,但我认为推荐数据didReceiveMemoryWarning的重点是,如果你收到这些警告,那么你自己的应用程序可能有被终止的危险.因此,虽然目前的情况viewDidUnload可能总是被称为内存警告的结果,但未来可能并非总是这样,因此从概念上讲,释放数据didReceiveMemoryWarning本身更有意义.在didReceiveMemoryWarning你知道有记忆压力,viewDidUnload你可能没有.因此,虽然重新创建数据的确很昂贵,但这可能比终止您的应用程序更好.对于用户来说,它看起来好像应用程序崩溃了.

我对这些方法的个人处理方法通常如下:

  • viewDidUnload - 释放对从nib加载的UI元素的任何引用.释放我自己创建的任何UI元素viewDidLoad.
  • didReceiveMemoryWarning - 释放在UI演示中使用的任何数据,如果/ viewDidLoad再次调用(或某些其他应用程序特定事件),我可以重新创建.不要发布任何我无法重现的东西.