2012-02-13 62 views
0

通常,当我使用viewcontroller时,会将当前viewcontroller推开,我使用UINavigationController并push/pop新viewcontrollers并让它们自己处理所有的dealloc。通过addSubiew添加的子视图viewcontroller是否需要dealloc?

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

下面是代码来说明:

//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@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方法?

谢谢!

回答

1

是的,在这种情况下,您确实需要dealloc方法,就像您拥有它一样。你在正确的轨道上,因为你认为既然你没有做任何手动分配,你不需要做任何dealloc /释放......但是,通过指定属性(保留,非原子),你是做隐性保留。

这意味着,如果你设置这些属性,有什么幕后实际发生的是这样的:

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

正如你所看到的,你的合成是造成保留的对象上发生。如果你永远无法平衡保留与释放,它会泄漏。因此,唯一合乎逻辑的地方就是使用dealloc方法。这创造了生命的圈子。

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

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

希望有所帮助。

0

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

实际上,如果secondaryViewController是ivar,那么保留对​​它的引用可能是有意义的。如果它是一个局部变量,并且稍后您不访问它,则应该释放它。

+0

谢谢。然而,我的问题是,我是否需要在secondaryViewController中使用dealloc()方法。 – kurisukun 2012-02-13 01:15:11

1

我认为这是允许在最新的iOS 5 +,但以前你不应该添加另一个viewcontrollers视图到你的主视图控制器。这是明显的滥用,并可能导致问题。

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

所以请重新考虑设计。为什么你需要SecondaryViewController。为什么mainviewcontroller不能管理辅助视图?

最后,每个viewcontroller应该有dealloc在里面。

+0

我认为如果我把每个子视图的逻辑放在他们自己的视图控制器中,它会更干净和模块化。我实际上有3个子视图(和每个控制器),每个都有不同的逻辑,需要在其中进行处理。将所有逻辑放入一个mainviewcontroller是否更好?会出现什么样的问题? – kurisukun 2012-02-13 02:38:39

相关问题