The -dealloc
是正确的,并且-viewDidUnload
会起作用,但通常保留的视图只会被清零-viewDidUnload
并且没有被释放。这似乎也是 Apple 的做法,当您通过 Assistant 编辑器创建自动生成的 IBOutlet 时,他们会将其融入 Xcode 中。
对于自动生成的 IBOutlet,自动生成的-viewDidUnload
看起来像这样:
- (void)viewDidUnload {
[self myView1:nil];
[self myView2:nil];
[self myView3:nil];
[super viewDidUnload];
}
另外,从苹果文档 http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html on -viewDidUnload
:
放弃任何对象(包括 Outlet 中的对象)所有权的首选方法是使用相应的访问器方法将对象的值设置为 nil。但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象
那么,就这样吧。如果你的插座有一个与之相关的属性(他们都应该不再这样了),那么将其归零-viewDidUnload
——但不要释放它。当您考虑合成访问器中实际发生的情况时,这是有道理的;代码看起来像这样:
- (void) setMyView1 : (UIView *) view {
if (myView1) // the associated IVAR is already set
[myView1 release];
myView1 = [view retain];
}
如您所见,将合成属性设置为 nil 会隐式释放保留的对象。
还来自有关的文档-dealloc
:
如果您实现此方法,但正在为 iOS 2.x 构建应用程序,那么您的 dealloc 方法应该释放每个对象,但还应该在调用 super 之前将该对象的引用设置为 nil。
除非你支持iOS2.x,否则不需要在dealloc中将对象设置为nil。
因此,总结一下 Apple 的文档-viewDidUnload
and -dealloc
:
- In
-viewDidUnload
, nil 属性(包括 IBOutlet 属性),但是don't释放他们
- In
-dealloc
释放属性,但是don't将它们归零(除非是为 2.x 构建)。