[iOS] UIViewController生命周期相關

VC的生命周期是我們編程中經常用到的幾個API, 特此借鑒整理

UIViewController生命周期.png

當你alloc并init了一個ViewController時,這個ViewController應該是還沒有創建view的。
ViewController的view是使用了lazyInit方式創建,就是說你調用的view屬性的getter:[self view]。
在getter里會先判斷view是否創建,如果沒有創建,那么會調用loadView來創建view。
loadView完成時會繼續調用viewDidLoad。loadView和viewDidLoad的一個區別就是:loadView時還沒有view。而viewDidLoad時view以及創建好了。
當view被添加其他view中之前時,會調用viewWillAppear,而之后會調用viewDidAppear。
當view從其他view中移出之前時,會調用viewWillDisAppear,而之后會調用viewDidDisappear。
當view不在使用,而且是disappeared,受到內存警告時,那么viewController會將view釋放并將其指向nil。

1、init里不要出現創建view的代碼。良好的設計,在init里應該只有相關數據的初始化,而且這些數據都是比較關鍵的數據。init里不要掉self.view,否則會導致viewcontroller創建view。(因為view是lazyinit的)。
2、loadView中只初始化view,一般用于創建比較關鍵的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非關鍵的view。如果你是從nib文件中創建的viewController在這里一定要首先調用super的loadView方法,但建議不要重載這個方法。
3、viewDidLoad 這時候view已經有了,最適合創建一些附加的view和控件了。有一點需要注意的是,viewDidLoad會調用多次(viewcontroller可能多次載入view,參見上圖)。
4、viewWillAppear 這個一般在view被添加到superview之前,切換動畫之前調用。在這里可以進行一些顯示前的處理。比如鍵盤彈出,一些特殊的過程動畫(比如狀態條和navigationbar顏色)。
5、viewDidAppear 一般用于顯示后,在切換動畫后,如果有需要的操作,可以在這里加入相關代碼。
6、viewDidUnload 這時候viewController的view已經是nil了。由于這一般發生在內存警告時,所以在這里你應該將那些不再顯示的view釋放了。比如你在viewcontroller的view上加了一個label,而且這個label是viewcontroller的屬性,那么你要把這個屬性設置成nil,以免占用不必要的內存,而這個label在viewDidLoad時會重新創建

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

推薦閱讀更多精彩內容