viewDidUnload中的可可触摸释放视图



我知道如果我使用属性保留IBOutlet,那么我必须在viewDidUnload中将其设置为nil,但其他的呢?

例如,我有三个子视图view1、view2和view3,它们从nib加载,是控制器的头文件

@interface MyViewController : UIViewController {
    IBOutlet UIView *view1;
    UIView *view2;
    //no reference for view3
}
@property (nonatomic, retain) IBOutlet UIView *view2;  //property view2 is an IBOutlet!!
@end

方法CCD_ 2

- (void)viewDidUnload {
    self.view2 = nil;
    //[view1 release];
    //view1 = nil;
    [super viewDidUnload];
}

我必须释放view1并将其设置为零吗?或者UIViewController会为我将其设置为零?view3怎么样?

我还必须在dealloc中发布view1吗?

编辑:我想很多人不理解我的问题

首先,view1是一个IBOutlet,它声明为ivar并分配一个ivar不会保留它。我知道UIViewController肯定会保留它,但我必须发布它还是UIViewController会为我发布它?如果UIViewController将发布它,那么我就没有必要再次发布它。

其次,view2也是一个IBOutlet,尽管它被声明为一个属性而不是ivar。

@property (nonatomic, retain) IBOutlet UIView *view2;

它是一个保留属性,因此设置它将保留它,所以我知道我必须将它设置为零才能释放它。我对此没有问题。

对于view3,没有对它的引用,因此我假设我不必对此做任何事情。我还假设没有必要在nib中对every对象进行引用。

默认情况下,即使没有为所有出口声明属性,也会保留所有出口。所以你需要释放他们。如果你继续宣布assigned财产为出口,那么你不需要释放,但你也不能依赖它,因为你不是所有者。

因此,您需要同时发布view1view2,因为它们被声明为outlet。view3是一个不存在的变量,因此不必担心。

加载一个nib时,它的所有对象都会自动实例化并保留。nib文件的所有者就是UIView的所有者。

如果使用UIView*view2,则无法使用接口生成器连接它们。所以这对我来说没有什么意义。

你也必须在解除锁定中释放。

- (void)viewDidUnload {
  self.view1 = nil;
  self.view2 = nil;
  [super viewDidUnload];
}
- (void)dealloc {
  [self.view1 release];
  self.view1 = nil;
  [self.view2 release];
  self.view2 = nil;
}