1. viewDidLoad在視圖加載時調用,viewWillAppear在視圖變爲可見時調用。
如果您的viewDidLoad被多次調用,這意味着您每次顯示視圖時都加載視圖,並在每次彈出視圖時將其釋放。如果您發佈了一些代碼,我可以幫助您更好地發現問題。
你可以做的是這樣的:
在你的「根」的viewController類,聲明每個「葉子」的ViewController的一員,可以說,他們被稱爲leafController1,leafController2等,併爲保留的屬性他們。
@interface YourRootViewController : UIViewController {
LeafController1Class *leafController1;
LeafController2Class *leafController2;
// ...
}
@property (nonatomic, retain) LeafController1Class *leafController1;
@property (nonatomic, retain) LeafController2Class *leafController2;
// ...
@end
在你的頂部視圖控制器的viewDidLoad中,使用「initWithNibName」等(或任何你正在做創建它們)初始化所有的葉控制器。保留他們的情況下,像這樣:
self.leafController1 = [[[LeafController1Class alloc] initWithNibName:@"LeafController1NibName" bundle:nil] autorelease];
當用戶按下一個按鈕,按下正確的葉到navigationcontroller:
[myNavigationController pushViewController:leafController1 animated:YES];
如果現在流行的葉控制器,因爲它們會被保存在內存中你保留了它們。 這樣你的viewDidLoad只會爲每個葉子調用一次,只要你總是將相同的視圖控制器的實例推送到你的navigationcontroller。
2. 與視圖相關的重碼應在視圖載入時執行,即由viewDidLoad觸發。但也可能是一個好主意,讓其他類保存有關您的應用程序的信息,這些信息不是視圖控制器,並與UI分離。大量計算最好在後臺進行,或者第一次加載應用程序。
viewDidLoad每次被視爲「初始化」而不是每次被添加到堆棧時都會被調用 – sunrize920
我在我的回覆中解釋說:「每次B彈出堆棧時,發佈,每次你去B B創建一個新的實例「又名init/viewDidLoad將被稱爲每次你訪問B. –
我不會說這是典型的發佈。當視圖屬性被釋放/設置爲零時,viewDidUnload僅在視圖控制器上被調用,並且這通常僅在應用程序收到內存警告時纔會發生。 – sunrize920