4

这是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);
}
4

3 回答 3

5

-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。

所以,总结一下苹果关于-viewDidUnloadand的文档-dealloc

  • -viewDidUnload,nil 属性(包括 IBOutlet 属性),但不要释放它们
  • -dealloc发布属性中,但不要将它们归零(除非为 2.x 构建)。
于 2011-08-14T16:10:35.850 回答
1

我不确定这是否是最好的方法,但如果您在 viewDidLoad 中保留这些视图,这是正确的方法。

请注意,在 dealloc 中,不需要将变量设置为 nil,但这样做不会有什么坏处,因此我们可以对 viewDidLoad 和 dealloc 使用相同的方法。

于 2011-08-14T17:26:13.233 回答
0

除非您在 viewDidLoad 中重新创建它们,否则不要在 viewDidUnload 中执行此操作,或者它们是 IBOutlets。这里这里的好信息。

于 2011-08-14T16:07:23.427 回答