2011-02-22 60 views
1

当我将它们作为保留它们的实例变量引用时,我应该在viewDidUnload中释放UIView的子视图吗?我以编程方式构建了GUI。我应该这样做吗?由于uiview和ivars都保留,所以这些对象将有2个保留计数,当视图接收到例如记忆警告然后UIView将释放子视图,但他们仍然有+1保留计数,所以我必须setself.myIvar = nil;在viewDidUnload中?我应该在viewDidUnload中发布UIView的子视图吗?

谢谢你的时间。

+2

我想这就是为什么苹果把这个评论放在模板的viewDidUnload方法中// //释放主视图的任何保留子视图。 //例如self.myOutlet = nil;` – 2011-02-22 18:44:00

+0

@fluchtpunkt你能否详细说明你的评论并将其作为回答发布?他们什么时候应该重新初始化? – JoePasq 2011-02-22 18:51:12

回答

1

您实际上可以在viewDidUnload中释放所有保留的子视图。但我曾经以另一种方式做:

-(void) viewDidLoad { 
    someInstanceView1 = [[UIView alloc] init]; 
    [self.view addSubview: someInstanceView1]; 
    [someInstanceView1 release]; 

    someInstanceView2 = [[UIView alloc] init]; 
    [self.view addSubview: someInstanceView2]; 
    [someInstanceView2 release]; 

    //etc... 
    //you have a references to someInstanceView1 and someInstanceView2 with retained counts 1 
} 

在这种情况下,即使出现内存警告,视图控制器将删除所有的视图子视图。然后再次调用viewDidLoad。所以不会有泄漏,你不需要关心如何释放这些ivars,因为唯一的所有者(它对视图有强烈的引用)是视图控制器的视图,它会自动释放它们。

相关问题