通过addSubiew添加的子视图viewcontroller是否需要dealloc?

时间:2012-02-13 00:38:53

标签: iphone dealloc addsubview

通常当我使用一个将当前viewcontroller推出的viewcontroller时,我使用UINavigationController并推送/弹出新的viewcontrollers并让它们自己处理所有dealloc。

然而,例如,在这种情况下,我有一个MainViewController,它是应用程序启动时的默认视图。我有一个名为SecondaryViewController的第二个视图,它是主屏幕上的一个弹出窗口(有点像灯箱)。

以下是代码说明:

//From within mainViewController:
secondaryViewController = [SecondaryViewController alloc] initWithNibName:@"SecondaryViewController" bundle:nil]; 
[self.view addSubview:secondaryViewController.view];

secondaryViewController接口如下所示:

//interface
@interface SecondaryViewController : UIViewController
{
    IBOutlet UILabel *httpLabel;
    IBOutlet UIScrollView *scrollView;
}
@property(retain, nonatomic) IBOutlet UILabel *httpLabel;
@property(retain, nonatomic) IBOutlet UIScrollView *scrollView;

至于实现,@synthesize ivars有@property,但我没有做任何手动分配。但是,我确实采用了dealloc方法:

- (void)dealloc
{
    [httpLabel release];
    [scrollView release];
    [super dealloc];
}

但我不确定我是否需要上述内容。

所以我的问题如下:

1)在这种情况下我需要上面的dealloc方法吗?或者更一般地说,子视图何时需要dealloc方法?

2)如果我不需要它,是否取决于我是否通过addSubview或pushViewController添加了secondaryViewController?例如,如果我想用这个替换整个mainViewController:

[self.navigationController pushViewController:secondaryViewController animated:NO]

secondaryViewController是否需要dealloc方法?

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为这在最新的iOS 5+中是允许的,但之前您不应该将另一个viewcontrollers视图添加到主viewcontroller。这显然是滥用,可能导致问题。

viewcontroller的概念是控制所有视图的概念。视图控制器不应该控制另一个视图控制器,除非它是一个容器视图控制器,如UINavigationController / UITabBarController。

所以请重新考虑一下这个设计。你为什么需要SecondaryViewController。为什么mainviewcontroller也不能管理次要视图?

最后,每个viewcontroller都应该包含dealloc。

答案 1 :(得分:1)

是的,在这种情况下,你确实需要dealloc方法。你是在正确的轨道,因为你假设,因为你没有做任何手动分配,你不需要做任何dealloc /释放...但是,通过将属性指定为(保留,非原子),你是做隐式保留。

这意味着如果您设置了这些属性,那么实际发生的内容是这样的:

-(void)setHttpLabel:(UILabel *)newlabel
{
  if (newLabel != httpLabel)
  {
    [httpLabel release];
    httpLabel = [newLabel retain];
  }
}

如您所见,您的合成会导致对象发生保留。如果你永远不能平衡保留释放,它将泄漏。因此,唯一合理的地方就是你的dealloc方法。这创造了生命的循环。

如果你从未设置这些属性并且没有在dealloc中释放,那么它不会泄漏任何东西,但你显然不想做出这些假设。

如果您没有任何保留属性或任何手动分配ivars,那么只有这样,你能否使用dealloc方法。

希望有所帮助。

答案 2 :(得分:0)

如果在将其视图添加到层​​次结构后需要从主视图控制器访问secondaryViewController,则不应在此时解除分配。如果您在显示辅助控制器后不需要访问辅助控制器,则可以在此时取消激活它。

实际上,如果secondaryViewController是ivar,那么保留对​​它的保留引用可能是有意义的。如果它是一个局部变量并且您以后没有访问它,则应该将其解除分配。