iOS viewController的生命周期

ViewController

ViewController是IOS開發中MVC模式中的C,ViewController是view的controller,ViewController的職責主要包括管理內部各個view的加載顯示和卸載,同時負責與其他ViewController的通信和協調。

在IOS中,有兩類ViewController,一類是顯示內容的,比如UIViewController、UITableViewController等,同時還可以自定義繼承自UIViewController的ViewController;另一類是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式來存儲和管理ViewController,UITabBarController是以Array的形式來管理ViewController。

View的加載

可以看到,在Controller中創建View有2種方法,一種是使用Storyboard等可視化工具,另一種是通過代碼創建。可視化創建在工程中很少用到,因為它滿足不了開發者如饑似渴的需求--。

代碼創建界面文件

1.創建新的Empty Application Project

2.新建ViewController的類,添加loadView方法,及viewDidLoad等方法

View Code

3.在AppDelegate.m中的application:didFinishLaunchingWithOptions:中注冊ViewController

View Code

雖然我們可以在AppDelegate.m中的application:didFinishLaunchingWithOptions:中設置window的代碼后面添加view,但是在一般的工程中,我們不會在委托類中管理我們的View。 而是利用委托類中的UIWindow去添加UIViewController,再在ViewController類中去管理View。

附,創建帶NavigationController的代碼

View Code

ViewController生命周期

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

注意viewWillUnload和viewDidUnload已經在ios6被廢棄了,因為Clearing references to views is no longer necessary。

注意1.沒有viewWillLoad。

注意2.viewDidLoad和viewDidUnload并不是成對的。

啟動程序

2014-07-28 17:43:36.124 ViewLifeCycle[4007:a0b] View Did Load

2014-07-28 17:43:36.125 ViewLifeCycle[4007:a0b] View Will Appear

2014-07-28 17:43:36.128 ViewLifeCycle[4007:a0b] View Did Appear

按下Home鍵,并沒有任何記錄

雙擊Home鍵,刪除該程序

2014-07-28 17:43:51.327 ViewLifeCycle[4007:a0b] View Will Disappear

2014-07-28 17:43:51.327 ViewLifeCycle[4007:a0b] View Did Disappear

為什么按下Home鍵之后沒有調用viewWillDisappear和viewDidDisappear呢?

因為在ios4后引入了后臺的概念,當按下Home鍵之后,程序被掛起了,但是該View依然是原來的View,并不是新的。所以只有內存不夠的時候或程序被終止的時候,才會調用viewWillDisappear和viewDidDisappear。

View的卸載

loadView v.s. viewDidLoad

view的nib文件為nil時,手工創建視圖界面時調用loadView;當view的nib文件存在的時候,初始化工作在viewDidLoad中實現。

loadView時view還沒有生成,viewDidLoad時,view已經生成了。loadView方法用來創建一個新的view。loadView只會被調用一次,而viewDidLoad可能會被調用多次。

當受到內存警告時,那么此時系統默認操作會檢查當前視圖控制器的view是否還在使用,如果沒在使用且控制器實現了loadView方法,ViewController會將view release并將其指向為nil。

注意,不要在loadView中調用父類方法[super loadView],因為這會影響CPU性能。

注意2,切換前后臺不會調用viewWillAppear

參考文章

IOS學習筆記——ViewController生命周期詳解

IOS開發之界面生命周期(view lifecycle)

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

推薦閱讀更多精彩內容