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

lhu*_*ath 2 memory ios

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

该文档还说明,如果要在视图不可见时发出清除并且发出内存警告,则应在-viewDidUnload中对其进行相同的操作.

我想知道两件事:

  1. 这是否意味着我应该复制我的所有插座发布代码?把它全部放在-dealloc和-viewDidUnload中?这是一个非常痛苦的维护,很容易忘记!
  2. 我保证在-viewDidUnload之后重新加载视图时会重新填充所有的插件,包括我的笔尖中引用非视图对象的插件吗?

理想的答案回答了上述两个问题,如果在-dealloc VS -viewDidUnload中最佳地释放哪些属性之间存在区别,则详细阐明这一区别.

小智 5

-viewDidUnload严格用于释放IBOutlets与保留的属性.

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

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

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