不是[UIWindow addSubView:]保留?

时间:2010-05-20 12:46:58

标签: iphone cocoa-touch

检查:

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之后它仍然存在。

2 个答案:

答案 0 :(得分:3)

-addSubview:仅保留视图,控制器。

答案 1 :(得分:0)

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

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

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