通过addSubiew添加的子视图viewcontroller是否需要dealloc?
通常,当我使用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方法?
谢谢!
是的,在这种情况下,您确实需要dealloc方法,就像您拥有它一样。你在正确的轨道上,因为你认为既然你没有做任何手动分配,你不需要做任何dealloc /释放......但是,通过指定属性(保留,非原子),你是做隐性保留。
这意味着,如果你设置这些属性,有什么幕后实际发生的是这样的:
-(void)setHttpLabel:(UILabel *)newlabel
{
if (newLabel != httpLabel)
{
[httpLabel release];
httpLabel = [newLabel retain];
}
}
正如你所看到的,你的合成是造成保留的对象上发生。如果你永远无法平衡保留与释放,它会泄漏。因此,唯一合乎逻辑的地方就是使用dealloc方法。这创造了生命的圈子。
如果你从来没有设置这些属性,并且没有在dealloc中释放,那么它不会泄漏任何东西,但你显然不想做出这些假设。
如果您没有任何保留属性或任何手动分配ivars,那么只有这样,才可以使用dealloc方法。
希望有所帮助。
如果在将视图添加到层次结构后需要从主视图控制器访问secondaryViewController
,则不应在此时解除分配它。如果您在显示后不需要访问辅助控制器,则可以在此时解除分配。
实际上,如果secondaryViewController
是ivar,那么保留对它的引用可能是有意义的。如果它是一个局部变量,并且稍后您不访问它,则应该释放它。
我认为这是允许在最新的iOS 5 +,但以前你不应该添加另一个viewcontrollers视图到你的主视图控制器。这是明显的滥用,并可能导致问题。
viewcontroller的概念是控制所有视图的人。视图控制器不应该控制另一个视图控制器,除非它是容器视图控制器,例如UINavigationController/UITabBarController。
所以请重新考虑设计。为什么你需要SecondaryViewController。为什么mainviewcontroller不能管理辅助视图?
最后,每个viewcontroller应该有dealloc在里面。
我认为如果我把每个子视图的逻辑放在他们自己的视图控制器中,它会更干净和模块化。我实际上有3个子视图(和每个控制器),每个都有不同的逻辑,需要在其中进行处理。将所有逻辑放入一个mainviewcontroller是否更好?会出现什么样的问题? – kurisukun 2012-02-13 02:38:39
谢谢。然而,我的问题是,我是否需要在secondaryViewController中使用dealloc()方法。 – kurisukun 2012-02-13 01:15:11