loadView與ViewDidLoad

? ? ?以下的方法作為每為ios開發工作者,肯定很熟悉,但有時又容易混淆,我對這些方法做了歸納總結,有一部分是從網上找的,感覺不錯就記下了.

一、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文件的后續工作。

三、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(Interface Builder)中有時候就會迷糊.其實也很好區分,孤零零地創建了一個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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 27、ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是...
    煙雨平生花飛舞閱讀 623評論 0 1
  • 37.cocoa內存管理規則 1)當你使用new,alloc或copy方法創建一個對象時,該對象的保留計數器值為1...
    如風家的秘密閱讀 893評論 0 4
  • 每個ios開發者對loadView和viewDidLoad肯定都很熟悉,雖然這兩個函數使用上真的是非常簡單,但是和...
    LuckTime閱讀 1,480評論 0 0
  • 前言: 這部分內容,對于大部分人來說使用起來可能已經非常熟練,但是涉及到的細節還是挺多的,對于新開發者可能不是...
    饒鵬偉閱讀 1,006評論 1 5
  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 725評論 0 1