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

标签 ios memory

iOS 文档说你的 View Controller 应该释放(并且 nil,因为这是一个很好的实践,实际上是 2.x 兼容性的必要条件)任何在 -dealloc 中保留的 socket 。

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

我想知道两件事:

  1. 这是否意味着我应该复制所有导出发布代码?把它全部放在-dealloc 和-viewDidUnload 中?维护起来真的很痛苦,而且很容易忘记!
  2. 我是否保证在 -viewDidUnload 之后重新加载 View 时,我的所有导出都将被重新填充,包括我的 nib 中引用非 View 对象的导出?

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

最佳答案

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

这样做的原因与 UIViewController 有一个它保留的 View 属性有关。该 View 属性自身 保留对其所有 subview 的引用。这些 subview 正是您在这些 socket 属性中保留的内容。问题在于这些 subview 有一个“额外的”保留。

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

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

关于ios - 发布网点的最佳和最安全的做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4873749/

相关文章:

ios - 如何以编程方式填充 ScrollView 宽度

ios - Fabric , Digit 不回找好友列表

ios - 将 subview 固定到 stackview 的前缘和后缘

ios - 容器 Controller 和 iOS 6 轮换

php - three20 gallery如何加载图片?

c++ - 在 CUDA 中传递内核参数?

json - 使用 JSON 文件的 Node.js 应用程序会在连接之间共享内存吗?

从 StringBuilder 进行 toString 转换的 Java 替代品

c - 宽度不兼容的变量

c - 读取简单 CSV 文件时出现段错误 - C