控制器的生命週期

2021-09-24 06:35:31 字數 2061 閱讀 6936

當乙個檢視控制器被建立,並在螢幕上顯示的時候。**的執行順序

1、alloc建立物件,分配空間

2、init (initwithnibname)初始化物件,初始化資料

3、loadview從nib載入檢視,通常這一步不需要去干涉。除非你沒有使用xib檔案建立檢視

4、viewdidload載入完成,可以進行自定義資料以及動態建立其他控制項

當乙個檢視被移除螢幕並且銷毀的時候的執行順序,這個順序差不多和上面的相反

3、dealloc檢視被銷毀,此處需要對你在init和viewdidload中建立的物件進行釋放

關於viewdidunload :在發生記憶體警告的時候如果本檢視不是當前螢幕上正在顯示的檢視的話,

viewdidunload將會被執行,本檢視的所有子檢視將被銷毀,以釋放記憶體,此時開發者需要手動對viewload、viewdidload中建立的物件釋放記憶體。

因為當這個檢視再次顯示在螢幕上的時候,viewload、viewdidload再次被呼叫,以便再次構造檢視。

1)- (void)viewdidload;

2) - (void)viewdidunload;

在記憶體足夠的情況下,軟體的檢視通常會一直儲存在記憶體中,但是如果記憶體不夠,一些沒有正在顯示的viewcontroller就會收到記憶體不夠的警告,然後就會釋放自己擁有的檢視,以達到釋放記憶體的目的。但是系統只會釋放記憶體,並不會釋放物件的所有權,所以通常我們需要在這裡將不需要在記憶體中保留的物件釋放所有權,也就是將其指標置為nil。

這個方法通常並不會在檢視變換的時候被呼叫,而只會在系統退出或者收到記憶體警告的時候才會被呼叫。但是由於我們需要保證在收到記憶體警告的時候能夠對其作出反應,所以這個方法通常我們都需要去實現。

系統在載入所有資料後,將會在螢幕上顯示檢視,這時會先呼叫這個方法。通常我們會利用這個方法,對即將顯示的檢視做進一步的設定。例如,我們可以利用這個方法來設定裝置不同方向時該如何顯示。

在檢視變換時,當前檢視在即將被移除、或者被覆蓋時,會呼叫這個方法進行一些善後的處理和設定。

我們可以重寫這個方法,對已經消失,或者被覆蓋,或者已經隱藏了的檢視做一些其他操作。

啟動的順序可以概括為:

一、loadview

永遠不要主動呼叫這個函式。view controller會在view的property被請求並且當前view值為nil時呼叫這個函式。如果你手動建立view,你應該過載這個函式,且不要在過載的時候呼叫[super loadview]。如果你用ib建立view並初始化view

controller,那就意味著你使用initwithnibname:bundle:方法,這時,你不應該過載loadview函式。

這個方法系統的預設實現是這樣:

1;尋找有關可用的nib檔案的資訊,根據這個資訊來載入nib檔案//所以,nib的載入過程是在loadview中完成的哦。

2;如果沒有有關nib檔案的資訊,預設建立乙個空白的uiview物件,然後把物件成賦值給viewcontroller的主view。

所以,如果你決定過載這個函式時,你也應該完成這些步驟:

把子類的view賦給view屬性(property)(你create的view必須是唯一的例項,並且不被其他任何controller共享),而且你過載的這個函式不應該呼叫super,這個也是為了保持主view與controller的單一對映關係。

二、viewdidload

這個函式在controller載入了相關的views後被呼叫,而不論這些views儲存在nib檔案裡還是在loadview函式中生成。

這個函式的作用主要是讓你可以進一步的初始化你的views。viewdidload通常負責的是view及其子view被載入進記憶體之後的資料初始化的工作,即檢視的資料部分的初始化。在ios 3.0以及更高版本中,你應該過載viewdidunload函式來釋放任何對view的引用或者它裡面的內容(子view等等)。

其多數情況下是做nib檔案的後續工作。

所以流程應該是這樣:

loadview來載入view(無論nib檔案或自定義的views)到記憶體——>viewdidload函式進一步初始化這些view(通常是側重於資料data的初始化)——>記憶體不足時,呼叫viewdidunload函式釋放views

控制器的生命週期

import mjoneviewcontroller.h inte ce mjoneviewcontroller property nonatomic strong nsarray property nonatomic strong nsarray persons end implementatio...

控制器的生命週期

關於viewdidunload 在發生記憶體警告的時候如果本檢視不是當前螢幕上正在顯示的檢視的話,viewdidunload將會被執行,本檢視的所有子檢視將被銷毀,以釋放記憶體,此時開發者需要手動對viewload viewdidload中建立的物件釋放記憶體。因為當這個檢視再次顯示在螢幕上的時候,...

控制器的生命週期

view載入完畢 void viewdidload super viewdidload nslog mjoneviewcontroller viewdidload view即將顯示到window上 view顯示完畢 已經顯示到視窗 view即將從window上移除 即將看不見 view從window...