iOS 文档说你的 View Controller 应该释放(并且 nil,因为这是一个很好的实践,实际上是 2.x 兼容性的必要条件)任何在 -dealloc 中保留的 socket 。
文档还说,如果您希望在 View 不可见且发出内存警告时允许它们被清理,您应该对 -viewDidUnload 中的导出执行相同的操作。
我想知道两件事:
- 这是否意味着我应该复制所有导出发布代码?把它全部放在-dealloc 和-viewDidUnload 中?维护起来真的很痛苦,而且很容易忘记!
- 我是否保证在 -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/