发布网点的最佳和最安全的做法是什么?

时间:2011-02-02 11:14:38

标签: ios memory

iOS文档说明你的视图控制器应该在-dealloc中释放(并且nil,因为这是良好的做法,实际上是2.x兼容性必须的)任何保留的插座。

文档还说明,如果您希望在视图不可见时清除它们并且发出内存警告,则应对-viewDidUnload中的插座执行相同的操作。

我想知道两件事:

  1. 这是否意味着我应该复制我的所有插座发布代码?把它全部放在-dealloc和-viewDidUnload中?这是一个非常痛苦的维护,很容易忘记!
  2. 我保证在-viewDidUnload之后重新加载视图时会重新填充我的所有商店,包括我的笔尖中引用非查看对象的商店吗?
  3. 理想的答案回答了上述两个问题,如果在-dealloc VS -viewDidUnload中最佳地释放哪些属性之间存在区别,则详细阐明这一区别。

3 个答案:

答案 0 :(得分:5)

-viewDidUnload 严格用于释放具有保留属性的IBOutlets。

这是因为UIViewController具有它保留的view属性这一事实。该视图属性本身保留对其所有子视图的引用。这些子视图正是您在这些插座属性中保留的内容。问题在于这些子视图对它们有“额外”的保留。

-viewDidUnload的目标是清除不必要的内存使用量。调用-viewDidUnload时,视图属性已经被释放,它会释放顶级UIView及其所有子视图。由于我们保留了其中一些子视图,因此它们会留在内存中,我们希望释放它们,因为它们将不再使用。当(如果)重新加载视图时,将创建这些子视图的新副本。属性也设置为nil,严格来说我们没有指向释放内存的指针。

-dealloc中,应释放所有保留的属性和实例变量。在-viewDidUnload刚刚执行的情况下,您将向IBOutlet保留的属性发送无害[nil release];,只需将其设置为nil。

答案 1 :(得分:3)

添加优秀答案:

使用Apple LLVM 3.0编译器(并启用了ARC),-dealloc的需求消失了(或至少需要释放其中的插座),只留下-viewDidUnload来处理。结果,不再有重复的代码。

答案 2 :(得分:1)

尼克完全回答了问题的第一部分,所以我马上跳到第二部分。

确实你得到了保证!当您的视图从nib文件重新加载时,该nib文件上的所有内容都会重新加载。没有部分加载nib文件内容的方法,所以如果重新加载该nib,内部的所有内容也会重新加载。但是从笔尖装入的所有东西都有自动释放。所以你必须保留它们。如果您有奥特莱斯保留这些新装的课程,并且您将这些奥特莱斯作为笔记连接在笔尖上,那么您很高兴。在视图控制器上,示例控制器本身是该nib的文件所有者,view是nib上的根元素,视图由文件的所有者出口“view”保留,视图本身保留所有其他子元素。如果您有多个根元素或根视图未保留的元素,那么您必须确保这些元素的出口在系统自动加载nib时保留它们,如果您通过方法加载nib,那么您必须知道所有这些课程在到达您的代码时会自动释放。

简单视图也是类,当nib文件被加载时,其中的所有内容都被加载,而不是它的某些部分。管理网点是您的责任。