2011-05-30 46 views
1

我知道如果我通过使用属性来保留IBOutlet,那么我必须将它设置为零,但viewDidUnload中的其他值呢?release view in viewDidUnload

例如,我有三个子视图厂景,视图2和视图3,从笔尖该载荷,这是控制器的头文件

@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并将其设置为零?或UIViewController将它设置为零为我? view3怎么样?

我也必须释放view1在dealloc

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

首先,厂景是一个IBOutlet其宣布为伊娃和分配伊娃不会保留。我知道UIViewController肯定会保留它,但我必须释放它,否则UIViewController会为我释放它?如果UIViewController会释放它,那么我不得不再次释放它。

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

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

这是一个保留属性,因此设置将保留它,所以我知道我必须把它设置成零,以释放它。我对此毫无问题。

对于view3,没有参考,因此我假设我不必做任何事情。我还假设不需要为笔尖中的every对象做参考。

+0

为什么没有'view3'的参考? – 2011-05-30 09:42:21

+0

不是答案,但如果您在理解引用计数时遇到问题,只需记录它们:'NSLog(@“view1 retainCount:%d”,[view1 retainCount])'。这将帮助您查看要发布哪些视图。还要玩弄“泄漏”工具(build - > profile)。请记住,这并不总是会发生泄漏,例如,当viewController从未被释放时(因为从技术上讲,这不是问题 - 但它是更好的风格)。 – fzwo 2011-05-30 09:47:55

+0

@Deepak我必须为每个子视图做一个参考吗? – 2011-05-31 02:48:14

回答

0

即使没有为他们声明的属性,所有插座仍保留默认状态。所以你需要释放它们。如果你继续申报assign作为出路,那么你不需要发布,但是你不能依赖它,因为你不是所有者。

所以你需要释放view1view2,因为它们被声明为插座。 view3是一个不存在的变量,因此不必担心。

+0

出口提到view2在这里@属性(非原子,保留)IBOutlet UIView * view2;' – 2011-05-31 09:58:43

+0

编辑答案。 – 2011-05-31 10:18:11

+0

这很清楚。谢谢。 – 2011-05-31 10:46:10

0

当加载一个笔尖时,它的所有对象都会自动实例化并保留下来。 您的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

我可以连接view2属性和属性将保留view2我。为你的'dealloc'代码,为什么释放然后设置为零?我认为这会导致崩溃,因为将属性设置为零将再次释放,因为这是一个保留属性 – 2011-05-31 02:46:26