-dealloc 是正确的,-viewDidUnload 将起作用,但通常保留的视图仅在 -viewDidUnload 中被取消而不被释放。这似乎也是 Apple 的做法,当您通过 Assistant 编辑器创建自动生成的 IBOutlet 时,这也是他们在 Xcode 中所采用的做法。
对于自动生成的 IBOutlets,自动生成的 -viewDidUnload 如下所示:
- (void)viewDidUnload {
[self myView1:nil];
[self myView2:nil];
[self myView3:nil];
[super viewDidUnload];
}
另外,来自Apple docs 上的-viewDidUnload:
放弃任何对象(包括插座中的对象)所有权的首选方法是使用相应的访问器方法将对象的值设置为 nil。但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象
那么,就这样吧。如果您的插座有一个与之关联的属性(它们都应该不再),那么在-viewDidUnload 中将其归零——但不要释放它。当您考虑合成访问器中实际发生的事情时,这是有道理的。代码如下所示:
- (void) setMyView1 : (UIView *) view {
if (myView1) // the associated IVAR is already set
[myView1 release];
myView1 = [view retain];
}
如您所见,将 synthesize 属性设置为 nil 会隐式释放保留的对象。
也来自有关-dealloc 的文档:
如果你实现了这个方法,但正在为 iOS 2.x 构建你的应用程序,你的 dealloc 方法应该释放每个对象,但还应该在调用 super 之前将该对象的引用设置为 nil。
除非你支持iOS2.x,否则不需要在dealloc中将对象设置为nil。
所以,总结一下 Apple 关于 -viewDidUnload 和 -dealloc 的文档:
- 在
-viewDidUnload 中,nil 属性(包括 IBOutlet 属性),但不要释放它们
- 在
-dealloc 发布属性中,但不要将它们归零(除非为 2.x 构建)。