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

Posted

技术标签:

【中文标题】发布网点的最佳和最安全的做法是啥?【英文标题】:What's the best and safest practice for releasing outlets?发布网点的最佳和最安全的做法是什么? 【发布时间】:2011-02-02 11:14:38 【问题描述】:

ios 文档说您的视图控制器应该释放(并且为零,因为这是很好的做法,实际上是 2.x 兼容性的必要条件)-dealloc 中保留的所有出口。

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

我想知道两件事:

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

理想的答案回答了上述两个问题,如果在 -dealloc VS -viewDidUnload 中应该以最佳方式释放哪些属性之间存在区别,请详细阐明这种区别。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

总而言之,您对 1. 的回答是“是的,复制您的网点的发布,是的,这很痛苦,忍受它。”? 我错过了你的问题的一部分,你说你有从笔尖加载的非视图 IBOutlets。我不是 100% 肯定的,但我想说那些你应该只在 dealloc 中释放,因为它们与视图无关。希望有人能解决这个问题。【参考方案2】:

添加到优秀的答案:

使用 Apple LLVM 3.0 编译器(并启用 ARC),不再需要 -dealloc(或者至少不需要在其中释放您的 outlet),只剩下 -viewDidUnload 来处理。结果,不再有重复的代码。

【讨论】:

【参考方案3】:

尼克完美地回答了问题的第 1 部分,所以我马上跳到第 2 部分。

确实,您是有保证的!当您的视图从 nib 文件重新加载时,该 nib 文件上的所有内容都会重新加载。没有办法部分加载 nib 文件的内容,因此如果重新加载该 nib,内部的所有内容也将重新加载。但是从笔尖加载的所有东西都有一个自动释放功能。所以你必须保留它们。如果您有保留这些新加载的类的 Outlets,并且您将这些 Outlets 连接为 nib 上的 outlet,那么您就可以开始了。在视图控制器示例控制器本身是该笔尖的文件所有者,视图是笔尖上的根元素,视图由文件的所有者出口“视图”保留,所有其他子元素由视图本身保留。如果您有多个根元素或根视图不保留的元素,那么如果系统自动加载笔尖,则必须确保有这些元素的出口来保留它们,如果您通过方法加载笔尖,那么您必须了解所有这些类在到达您的代码时会自动释放。

简单的视图也是类,当一个 nib 文件被加载时,它里面的所有东西都会被加载,而不是它的一部分。管理网点是您的责任。

【讨论】:

以上是关于发布网点的最佳和最安全的做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

关于主题名称的最佳做法是啥

为 WebSocket 连接更新令牌的最佳做法是啥

(在表格中搜索)最佳做法是啥? [关闭]

创建链接以重置密码的最佳做法是啥? [关闭]

添加视频背景视图的最佳做法是啥?

健康检查的最佳做法是啥?