这-dealloc
是正确的并且-viewDidUnload
将起作用,但通常保留的视图仅被取消-viewDidUnload
而不被释放。这似乎也是 Apple 的做法,当您通过 Assistant 编辑器创建自动生成的 IBOutlet 时,这也是他们在 Xcode 中所采用的做法。
对于自动生成的 IBOutlets,自动生成的-viewDidUnload
看起来像这样:
- (void)viewDidUnload {
[self myView1:nil];
[self myView2:nil];
[self myView3:nil];
[super viewDidUnload];
}
此外,来自Apple 文档:-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。
所以,总结一下苹果关于-viewDidUnload
and的文档-dealloc
:
- 在
-viewDidUnload
,nil 属性(包括 IBOutlet 属性),但不要释放它们
- 在
-dealloc
发布属性中,但不要将它们归零(除非为 2.x 构建)。