发布保留视图的最佳做法?

hpi*_*que 4 iphone release dealloc ios viewdidunload

这是viewDidLoad在iOS 4.x或更低版本中发布保留的视图的正确(最佳?)方式吗?还有什么需要考虑的吗?

- (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);
}
Run Code Online (Sandbox Code Playgroud)

mem*_*ons 5

-dealloc是正确的,并且-viewDidUnload将起作用,但通常保留的视图仅被填入-viewDidUnload并且不被释放.这似乎也是Apple的做法,当你通过助手编辑器创建一个自动生成的IBOutlet时,它就是他们在Xcode中的内容.

对于自动生成的IBOutlets,自动生成的内容-viewDidUnload如下所示:

- (void)viewDidUnload {
    [self myView1:nil];
    [self myView2:nil];
    [self myView3:nil];
    [super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud)

此外,从苹果文档-viewDidUnload:

放弃任何对象(包括出口中的对象)的所有权的首选方法是使用相应的访问器方法将对象的值设置为nil.但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象

所以,你去吧.如果你的插座有一个与之相关的属性(它们都应该已经存在),那么就把它取出来-viewDidUnload- 但是不要释放它.当您考虑合成访问器中实际发生的情况时,这是有意义的; 代码看起来像这样:

- (void) setMyView1 : (UIView *) view {
   if (myView1) // the associated IVAR is already set
      [myView1 release];

   myView1 = [view retain];
}
Run Code Online (Sandbox Code Playgroud)

如您所见,将synthesize属性设置为nil会隐式释放保留的对象.

同样来自以下方面的文档-dealloc:

如果您实现此方法但正在为iOS 2.x构建应用程序,则dealloc方法应释放每个对象,但在调用super之前还应将该对象的引用设置为nil.

除非您支持iOS2.x,否则无需在dealloc中将对象设置为nil.

因此,总结一下Apple的文档-viewDidUnload-dealloc:

  • -viewDidUnload,nil属性(包括IBOutlet属性),但释放它们
  • -dealloc发布属性中,但不要使它们为零(除非为2.x构建).