ios開發–loadView和viewDidLoad

來源:互聯網
上載者:User

每個ios開發人員對loadView和viewDidLoad肯定都很熟悉,雖然這兩個函數使用上真的是非常簡單,但是和類似的initWithNibName/awakeFromNib/initWithCoder放在一起還是非常容易讓人混淆的.

一、loadView

永 遠不要主動調用這個函數。viewcontroller會在view的property被請求並且當前view值為nil時調用這個函數。如果你手動建立view,你應該重載這個函數,且不要在重載的時候調用[super loadview]。如果你用IB建立view並初始化viewcontroller,那就意味著你使用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被載入進記憶體之後的資料初始化的工作,即視圖的資料部分的初始化。在iOS3.0以及更高版本中,你應該重載viewDidUnload函數來釋放任何對view的引用或者它裡面的內容(子view等等)。

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

三、viewDidUnload

這個函數是viewDidLoad的對立函數。在程式記憶體欠缺時,這個函數被controller調用,來釋放它的view以及view相關的對象。由於controller通常儲存著view以及相關object的引用,所以你必須使用這個函數來放棄這些對象的所有權以便記憶體回收。但不要釋放那些難以重建的資料。

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

1 self.myCertainView
2  =nil;

這樣合成器會release這個view,如果你沒有使用property,那麼你得自己顯式釋放這個view。

四、結論

所以流程應該是這樣:

loadView來載入view(無論nib檔案或自訂的views)到記憶體——>viewDidLoad函數進一步初始化這些view(通常是側重於資料data的初始化)——>記憶體不足時,調用viewDidUnload函數釋放views

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

如此迴圈

   需要釐清兩個概念,建立一個類和執行個體化一個類.在XCode中建立一個類和執行個體化一個類很容易區分,但是在IB(InterfaceBuilder)中有時候就會迷糊.其實也很好區分,孤零零地建立了一個nib檔案,沒有和其他可被執行個體化的類有直接或間接關係的時候,這個類或這些類(一個nib檔案也可能包含多個類)是沒有機會被執行個體化的,所以這種情況只是通過ib建立了一個類,而沒有執行個體化.真正的執行個體化還需要通過在Xcode用代碼來讀取這個nib檔案.知道這兩這的區別後這些方法也就容易辨認多了

viewDidLoad其實沒什麼可混淆的,無論通過什麼途徑載入(Xcode或者IB,這裡的載入屬於執行個體化)完view後肯定會執行這個方法.

loadView需要分兩種情況.當你通過Xcode執行個體化一個類的時候就需要自己在controller中實現這個方法.而在IB中執行個體化就不需要實現它.

initWithNibName這個方法是在controller的類在IB中建立,但是通過Xcode執行個體化controller的時候用的.

initWithCoder是一個類在IB中建立但在xocdde中被執行個體化時被調用的.比如,通過IB建立一個controller的nib檔案,然後在xcode中通過initWithNibName來執行個體化這個controller,那麼這個controller的initWithCoder會被調用.

awakeFromNib 
當.nib檔案被載入的時候,會發送一個awakeFromNib的訊息到.nib檔案中的每個對象,每個對象都可以定義自己的awakeFromNib函數來響應這個訊息,執行一些必要的操作。也就是說通過nib檔案建立view對象時執行awakeFromNib 

viewDidLoad 
當view對象被載入到記憶體後就會執行viewDidLoad,所以不管通過nib檔案還是代碼的方式建立對象都會執行viewDidLoad。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.