2010-05-20 78 views
1

检查它:不[UIWindow addSubView:]是否保留?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSLog(@"Checking login--user value is %@", [defaults valueForKey:@"userID"]); 
if ([defaults valueForKey:@"userID"] == NULL){ 
    LoginViewController *loginController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil]; 
    [window addSubview:loginController.view]; 
    [loginController release]; 
} 
else { 
    [window addSubview:[navigationController view]]; 
} 

当我把一个子视图到另一个视图中的每个其他地方,我释放这个观点我已经做了之后,因为它现在已经被认为拥有它的子视图。在这里,当我做[loginController release]时,loginController上的每个IBAction都会被调用以解除分配的实例。评论这条线使一切正常。

我注意到我的loginController和模板附带的navigationController之间的差异; navigationController是在-(void)dealloc{ }中发布的综合属性,因此在放入window之后仍然存在。

回答

3

-addSubview:只保留该视图,而不是控制器。

+0

啊。回想起来,这很明显。我在那里看着一个无控制器的视图。所以我没有必要在视图上管理保留计数,那么,在那里?我想当它从RemoveSuperview中移除时,它会回落到1,然后当控制器被释放时(我需要使它成为一个属性,所以我可以在dealloc时间释放它,我猜)它会完全消失。是对的吗? – 2010-05-20 12:55:53

+0

@丹:是的。 (如果你想要一个无控制器视图,直接创建一个UIView。) – kennytm 2010-05-20 13:50:06

0

您不应该手动将控制器视图添加到视图层次结构,因为控制器不会被保留,即使保留也不会收到预期的系统调用(例如方向更改等)。

请使用其属性rootViewController将控制器添加到UIWindow

如果您仍然觉得需要在某处添加控制器视图,那么也许您不应该使用视图控制器,而应该使用简单的自定义视图。