iOS文档说明你的视图控制器应该在-dealloc中释放(并且nil,因为这是良好的做法,实际上是2.x兼容性必须的)任何保留的插座。
文档还说明,如果您希望在视图不可见时清除它们并且发出内存警告,则应对-viewDidUnload中的插座执行相同的操作。
我想知道两件事:
理想的答案回答了上述两个问题,如果在-dealloc VS -viewDidUnload中最佳地释放哪些属性之间存在区别,则详细阐明这一区别。
答案 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文件被加载时,其中的所有内容都被加载,而不是它的某些部分。管理网点是您的责任。