viewDidUnload中的释放视图

时间:2011-05-30 09:00:20

标签: cocoa-touch ios uiview uiviewcontroller

我知道如果我通过使用属性保留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

和方法viewDidUnload

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

我必须释放view1并将其设置为nil吗?或UIViewController会为我设置为零? 那么view3呢?

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

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

首先,view1是一个IBOutlet,它声明为ivar并指定一个ivar不会保留它。我知道UIViewController绝对会保留它,但是我必须释放它,否则UIViewController会为我发布它?如果UIViewController将释放它,那么我无需再次释放它。

其次,view2也是一个IBOutlet,虽然它被声明为不是ivar的属性。

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

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

对于view3,没有参考,因此我假设我不需要做任何事情。我还假设没有必要在nib中为every对象提供引用。

2 个答案:

答案 0 :(得分:0)

加载nib时,会自动实例化并保留其所有对象。 然后,您的nib文件的文件所有者是您的UIView的所有者。

如果使用UIView * view2,则无法使用界面构建器连接它们。 所以这对我来说没有意义。

你也必须以dealloc发布。

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

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

答案 1 :(得分:0)

默认情况下,所有商店都会被保留,即使他们没有为他们申报的商品。所以你需要释放它们。如果您继续将assign ed属性声明为插座,那么您不需要释放,但您不能依赖它,因为您不是所有者。

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