天天看點

iOS的init、loadView、 viewDidLoad、viewDidUnload的關系

釋出于:2012-11-20 10:56閱讀數:5320

在init方法中執行個體化必要的對象(遵從LazyLoad思想)。init方法中初始化ViewController本身。

“”

社群成員taonavy分享

init方法

在init方法中執行個體化必要的對象(遵從LazyLoad思想)

init方法中初始化ViewController本身

loadView方法

當view需要被展示而它卻是nil時,viewController會調用該方法。不要直接調用該方法。

如果手工維護views,必須重寫該方法。

如果使用IB維護views,必須不能重寫該方法。

loadView和IB建構view

viewDidLoad方法

重寫該方法以進一步定制view。

在iPhone OS 3.0及之後的版本中,還應該重寫viewDidUnload來釋放對view的任何索引。

viewDidLoad後調用資料Model。

viewDidUnload方法

當系統記憶體吃緊的時候會調用該方法(注:viewController沒有被dealloc)。

記憶體吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用記憶體的唯一方式,但是OS 3.0及以後viewDidUnload方法是更好的方式。

在該方法中将所有IBOutlet(無論是property還是執行個體變量)置為nil(系統release view時已經将其release掉了)。

在該方法中釋放其他與view有關的對象、其他在運作時建立(但非系統必須)的對象、在viewDidLoad中被建立的對象、緩存資料等。

release對象後,将對象置為nil(IBOutlet隻需要将其置為nil,系統release view時已經将其release掉了)。

一般認為viewDidUnload是viewDidLoad的鏡像,因為當view被重新請求時,viewDidLoad還會重新被執行。

viewDidUnload中被release的對象必須是很容易被重新建立的對象(比如在viewDidLoad或其他方法中建立的對象),不要release使用者資料或其他很難被重新建立的對象。

dealloc方法

viewDidUnload和dealloc方法沒有關聯,dealloc還是繼續做它該做的事情。

舉例:

12345678910111213141516/* * The view hierarchy for this controller has been torn down. This usually happens inresponse to low memory notifications. * All IBOutlets should be released by setting their property to nil in order to free upas much memory as possible.

* This is also a good place to release other variables that can be recreated when needed. */- (void)viewDidUnload {    self.startButton = nil;    [setupViewController release];    setupViewController = nil;} - (void)dealloc {    [startButton release];    [setupViewController

release];    [super dealloc];} 

loadView 手動加載view

viewDidLoad用于nib檔案加載後,進一步處理

viewDidUnload是viewDidLoad的鏡像

參考官方文檔,我給出糾正:

一、loadView

永遠不要主動調用這個函數。view controller會在view的property被請求并且目前view值為nil時調用這個函數。如果你手動建立view,你應該重載這個函數。如果你用IB建立view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,這時,你不應該重載loadView函數。

這個方法的預設實作是這樣:先尋找有關可用的nib檔案的資訊,根據這個資訊來加載nib檔案,如果沒有有關nib檔案的資訊,預設實作會建立一個空白的UIView對象,然後讓這個對象成為controller的主view。是以,重載這個函數時,你也應該這麼做。并把子類的view賦給view屬性(property)(你create的view必須是唯一的執行個體,并且不被其他任何controller共享),而且你重載的這個函數不應該調用super。

如果你要進行進一步初始化你的views,你應該在viewDidLoad函數中去做。在iOS 3.0以及更高版本中,你應該重載viewDidUnload函數來釋放任何對view的引用或者它裡面的内容(子view等等)。這個網上的資料都說的很不全面,尤其是藍色字部分。

二、viewDidLoad

這個函數在controller加載了相關的views後被調用,而不論這些views存儲在nib檔案裡還是在loadView函數中生成。而多數情況下是做nib檔案的後續工作。網上資料對這個函數的描述則完全不對。

三、viewDidUnload

這個函數是viewDidLoad的對立函數。在程式記憶體欠缺時,這個函數被controller調用()。由于controller通常儲存着與view(這裡黑體的view指controller的view屬性)相關的對象(一般是view的子view)或者其他運作時建立的對象的引用,是以你必須使用這個函數來放棄這些對象的所有權以便記憶體回收。但不要釋放那些難以重建的資料(不要在這個函數中釋放view)。

通常controller會儲存nib檔案建立的views的引用,但是也可能會儲存着loadView函數建立的對象的引用。最完美的方法是使用合成器方法:

self.myCertainView = nil;

這樣合成器會release這個view,如果你沒有使用property,那麼你得自己顯式釋放這個view。網上對這個函數的描述含含糊糊,看了等于沒看。

另外:如果controller存儲了其他object和view的引用,你還得在dealloc方法中釋放這些記憶體。對于iOS2.x,你還必須在調用super dealloc方法前将這些引用置為nil。

四、結論

是以流程應該是這樣:

(loadView/nib檔案)來加載view到記憶體 ——>viewDidLoad函數進一步初始化這些view ——>記憶體不足時,調用viewDidUnload函數釋放views

—->當需要使用view時有回到第一步