2012-02-08 44 views
0

裏面的UIViewController有屬性:UIViewController中的iPhone/iPad的UINavigationController屬性?

@property(nonatomic, readonly, retain) UINavigationController *navigationController 

我真的不知道這是怎麼財產使用......當我看到它的樣子,如果你有一個名爲navController導航控制器,並鍵入一些像這樣的代碼:

[navController pushViewController:nextController animated:YES]; 

發生了幾件事情。第一個nextController被推到navController棧的頂端。其次,navController保留nextController。第三,nextController(navigationController)的只讀屬性用navController初始化。 navController保留nextController,nextController保留navController。這樣做的結果是,如果你釋放navController,它不會被銷燬,因爲它被堆棧中的所有UIViewControllers保留。釋放它的唯一方法是從堆棧中彈出所有項目,然後釋放它。

這是如何所有這些功能,或者我錯過了什麼?

回答

0

是的,你錯過了當nextController的dealloc方法被調用時,它會釋放它的導航控制器。所以當你釋放navController時,它將釋放所有推送的視圖控制器,並且它們將釋放它們的navController。 換句話說,當你釋放一個導航控制器(假設版本計數爲零)時,它將彈出所有推送到它的視圖控制器。

+0

釋放方法被稱爲dealloc方法中釋放,這被稱爲時保留objec計數t是零。所以如果你在navController上調用release,他的保留計數不是零(記得堆棧中的所有UIViewControllers仍然保留它),並且他的dealloc方法沒有被調用。問題是,在navController的dealloc方法中,所有推入的控制器都被釋放(當你釋放它們時,所有navController的retain count都應該爲零,而不是在此之前),但是這種方法從來沒有被調用過。 – MegaManX 2012-02-08 12:11:00

+0

現在我明白了這個問題。但是,當你釋放一個導航控制器時,事情確實很好,並且不會出現泄漏。視圖控制器在導航控制器上保留的保留時間是暫時的,並且只有在導航控制器添加子視圖時。 – Gabriel 2012-02-08 12:51:41

+1

更多相關內容。我已經測試過它,當你推動一個視圖控制器時,你會得到一個遞增的導航控制器的retainCount,但直到該接口循環結束。然後保留計數導航控制器再次恢復其先前的值。所以它不是視圖控制器的真正保留屬性。 – Gabriel 2012-02-08 12:54:58

0

如果你已經有一個導航控制器和推視圖控制器裏面,那麼你可以使用這個屬性來處理導航控制器。例如

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc]; 

現在你是有導航控制器內的VC ..如果你想顯示另一個VC,你可以做這樣的[vc.navigationController pushViewController:detailViewController animated:YES];

你只需要[vc release]; [navController realese];

相關問題