ViewController的生命週期及其加載View的步驟

     首先先闡明ViewController的職責:對內管理與之關聯的View,對外跟其他ViewController通信和協調。對於與之關聯的View,ViewController總是在需要的時候才加載視圖,並在不需要的時候卸載視圖,所以也同時擔當了管理應用資源的責任。理解ViewController的LifeCycle(生命週期),能夠有效地管理應用資源。


ViewController的初始化:
從Storyboards中加載的時候,會調用initWithCode,如果不存在則調用init。之後對裏面的每個對象調用awakeFromNib方法。
從內存中alloc出來的情況下,調init方法。
ViewController查找與其關聯的view,其順序是:
1 先判斷子類是否重寫了loadView,如果有直接調用。之後調viewDidLoad完成View的加載。
2 如果是外部通過調用initWithNibName:bundle指定nib文件名的話,ViewController記載此nib來創建View。
3 如果initWithNibName:bundle的name參數爲nil,則ViewController會通過以下兩個步驟找到與其關聯的nib。
    A 如果類名包含Controller,例如ViewController的類名是MyViewController,則查找是否存在MyView.nib;
    B 找跟ViewController類名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib。
4  如果子類沒有重寫的loadView,則ViewController會從StroyBoards中找或者調用其默認的loadView,默認的loadView返回一個空白的UIView對象。
注意第一步,ViewController是判斷子類是否重寫了loadView,而不是判斷調用子類的loadView之後ViewController的View是否爲空。就是說,如果子類重寫了loadView的話,不管子類在loadView裏面能否獲取到View,ViewController都會直接調viewDidLoad完成View的加載。


ViewController的卸載View的步驟:
1 系統發出警告或者ViewController本身調用導致didReceiveMemoryWarning被調用
2 調用viewWillUnload之後釋放View
3 調用viewDidUnload


注意:

    由於Controller加載View時,會自動將一些View對象指向其對應的IBOutlet變量。
所以當view被卸載時我們必須在viewDidUnload將這些變量release掉,ViewController不會自動做這件事。
具體做法是將變量設置爲空,(注意和dealloc中將變量release的區別)注意此時Controller的view屬性是空的。
在ViewController的生命週期的各個階段,我們都有責任去適當的創建和銷燬對象,具體各個階段要做的事情,見官方文檔的表Managing Memory Efficiently

注:本文中的ViewController即視圖控制器,根類是UIViewController。View是視圖,根類是UIView。


轉自:http://blog.csdn.net/wihing/article/details/7314702

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