通常当我使用一个将当前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方法?
谢谢!
答案 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,那么保留对它的保留引用可能是有意义的。如果它是一个局部变量并且您以后没有访问它,则应该将其解除分配。