loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的調用時間及用法

1> loadView

無論XIB還是代碼創建都會調用loadView方法。self.view爲nil時纔會被調用。

     手工創建視圖時,loadView被調用時self.view還爲nil。一般在該方法中手工定製view。
      XIB創建視圖時,loadView仍會被系統調用、loadView被調用時XIB定製的視圖還沒創建完成,若是再覆寫該方法的話、會將XIB定製的視圖覆蓋掉。

所以,純手工定製視圖時,一般在該方法中寫;

XIB定製視圖時、一定不要覆寫該方法。


2>viewDidLoad

無論XIB還是代碼創建都會調用viewDidLoad方法。

     手工創建視圖時,viewDidLoad被調用時self.view已經創建完成。可在在該方法中進一步定製視圖。
      XIB創建視圖時,viewDidLoad仍會被調用,viewDidLoad被調用時self.view已經創建完成。可在在該方法中進一步定製視圖。

所以,無論那種方式定製視圖、都可以覆寫該方法。

注:但是在Xcode6.3版本下,個人測試結果爲:

當一個類的awakeFromNib被調用的時候,那麼這個類的viewDidLoad就不會被調用了,

直接從storyboard中加載控制器也不會再調用這個類的viewDidLoad方法


3>initWithCoder

是一個類在IB中創建但在Xcode中被實例化時被調用的.比如,通過XIB創建一個controller的nib文件,然後在xocde中通過initWithNibName來實例化這個controller,那麼這個controller的initWithCoder會被調用。

備註:依個人使用來說,這個方法在解檔歸檔的時候纔會有具體明確的作用(歡迎各位同行繼續補充)

寫入提取方法   

<span style="font-family:Lucida Grande, Lucida sans Unicode, Arial, Verdana, sans-serif;">// 1.歸檔路徑
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"stu.data"];
    //2.歸檔模型對象
    [NSKeyedArchiver archiveRootObject:stu toFile:path];
    // 3.從文件中讀取Student對象
    YHStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path ];</span>

cocoa具備一種機制來將對象自身轉換爲某種格式並保存中磁盤上。

對象可以將它們的實例變量和其他數據編碼爲數據塊,然後保存到磁盤中。以後將這些數據塊都會到內存中,並且還能基於保存的數據創建新對象。這個過程稱爲編碼和解碼,或稱爲序列化和反序列化。

要編碼的對象,必須實現NSCoding協議。

當對象需要保存自身時-encoderWithCoder:方法被調用

當對象需要加載自身時-initWithCoder:方法被調用

initWithCode:和其他init方法一樣,中對對象執行操作之前,需要使用超類對它們進行初始化。爲此,可以採用兩種方式,具體取決於父類,如果父類採用了NSCoding協議,則應該調用[superinitWithCoder:decoder];

否則,只需要調用[superinit]即可。


4>initWithNibName

一般情況下調用 init方法或者調用initWithNibName方法實例化UIViewController, 不管調用哪個方法最終都會調用initWithNibName方法。
 當控制器被initWithNibName:並加入到導航控制器的棧中時,它不會加載nib文件,直到nib文件被實際顯示。因此控制器在nib文件中定 義的內容,例如label,可能還沒有實例化。此時label可能只是一個nil指針,需要額外使用代碼中實現的屬性來存儲信息。可以在 viewWillAppear:方法中對niv實例化的對象屬性進行設置。 

注:有兩種方法可以加載XIB中的視圖,摘錄兩種的小別如下

initWithNibName方法:是延遲加載,這個View上的控件是 nil 的,只有到 需要顯示時,纔會不是 nil 

loadNibNamed方法:即時加載,用該方法加載的xib對象中的各個元素都已經存在。 

5>awakeFromNib

在使用XIB的時候纔會涉及到此方法的使用,當.nib文件被加載的時候,會發送一個awakeFromNib的消息到.nib文件中的每個對象,每個對象都可以定義自己的awakeFromNib函數來響應這個消息,執行一些必要的操作。


參考鏈接:

http://blog.csdn.net/lvmaker/article/details/27177113

http://blog.sina.com.cn/s/blog_5eadd29401011hzj.html

http://zhidao.baidu.com/link?url=T_EFD7HrZBqB_0JxeohoeXN9VFT4ZMh-0xQSLgAvY-JaowfvDCVwlDe_4Dc-V7m8YQE4GoULlcwddrdsYferj55dZjJL41128hYCqQEIria

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章