发布保留视图的最佳做法?
这是在iOS 4.x或更低版本中发布viewDidLoad
中保留的视图的正确(最佳?)方式吗? 还有什么需要考虑的吗?
- (void) viewDidUnload { [super viewDidUnload]; [self releaseViews]; } - (void) dealloc { [self releaseViews]; [super dealloc]; } #define SAFE_RELEASE(a) [a release]; a = nil; - (void) releaseViews { SAFE_RELEASE(myView1); SAFE_RELEASE(myView2); SAFE_RELEASE(myView3); }
-dealloc
是正确的, -viewDidUnload
可以工作,但通常保留的视图只在-viewDidUnload
中-viewDidUnload
而不是释放。 这似乎也是Apple的做法,当你通过助手编辑器创建一个自动生成的IBOutlet时,它就是他们融入Xcode的东西。
对于自动生成的IBOutlets,自动生成的-viewDidUnload
如下所示:
- (void)viewDidUnload { [self myView1:nil]; [self myView2:nil]; [self myView3:nil]; [super viewDidUnload]; }
另外,来自Apple文档 -viewDidUnload
:
放弃任何对象(包括出口中的对象)的所有权的首选方法是使用相应的访问器方法将对象的值设置为nil。 但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象
所以,你去吧。 如果你的sockets有一个与之关联的属性(它们都应该已经存在),那么在-viewDidUnload
它-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
发布属性中,但不要-dealloc
它们(除非为2.x构建)。
我不确定它是否是最好的方法,但如果你在viewDidLoad中保留了这些视图,这是正确的方法。
请注意,在dealloc中不需要将变量设置为nil,但这样做不会有害,因此我们可以对viewDidLoad和dealloc使用相同的方法。
除非您在viewDidLoad中重新创建它们,否则不要在viewDidUnload中执行它,或者它们是IBOutlets。 这里和这里的好信息。