2010-05-20 34 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

如果您仍然覺得需要在某處添加控制器視圖,那麼也許您不應該使用視圖控制器,而應該使用簡單的自定義視圖。