生命周期
2、簡述應用生命周期
App啟動:當App啟動時,首先由not running狀態切換到inactive狀態,此時調用application:didFinishLaunchingWithOptions:方法;然后由inactive狀態切換到active狀態,此時調用applicationDidBecomeActive:方法。當App發生中斷時,由active狀態切換到inactive狀態,此時調用applicationWillResignActive:方法。
來回切換App:當切換到另一個App時,由狀態active切換到inactive,此時調用applicationWillResignActive:方法;然后從inactive狀態切換到running狀態,此時調用applicationDidEnterBackground:方法。而當切換回本來的App時,由running狀態切換到inactive狀態,此時調用applicationWillEnterForeground:方法,然后由inactive狀態切換到active狀態,調用applicationDidBecomeActive:方法。
鎖屏:當手機鎖屏時,由狀態active切換到inactive,此時調用applicationWillResignActive:;然后再由inactive狀態切換到running狀態,此時調用applicationDidEnterBackground:方法。
系統常常是為其他app啟動時由于內存不足而回收內存最后需要終止應用程序,但有時也會是由于app很長時間才響應而終止。如果app當時運行在后臺并且沒有暫停,系統會在應用程序終止之前調用applicationWillTerminate:來保存用戶的一些重要數據以便下次啟動時恢復到app原來的狀態。
http://www.cocoachina.com/industry/20140710/9089.html
3、簡述視圖生命周期
viewController叫做視圖控制器。對內是用于管理視圖,對外則是與其他的viewcontroller進行通信。它繼承于NSObject。它分為兩種類型,一種叫contentViewController,內容視圖控制器,主要用于體現內容 如UITableView UIViewController這種直接顯示內容的;還有一種叫做containerViewController,容器視圖類。典型的就是tabBar,和navigation.它還包含好幾個其它的viewController.
每個view都有一個viewController。且view的生命周期也在viewController里面。所以在view釋放之前,viewcontroller是不可以釋放的。
step1:initWithNib ? ?viewController會進行alloc,并init.
step2: loadView在這里會看它的子類是否有重寫這個函數,如果重寫了則調用子類的,否則就調用她自己的。注意,這個時候視圖還是沒有沒加載進來的哦。
step3:viewDidLoad這個時候視圖已經存在了。可以在這里添加你想要添加的UI控件了。
step4:viewWillAppear視圖將出現在屏幕上了
step5:viewDidAppear視圖已經成功在屏幕上渲染完成了
step6:viewWillDisappear視圖將要消失了
step7:viewDidDisappear視圖從屏幕上消失了
step8:viewDidUnLoad當發生內存警告的時候,如果本視圖不是當前正在顯示的視圖,則會執行這個函數。將子視圖釋放。
step9:dealloc釋放viewController
而view的生命周期則是step3——step8.
viewController的生命周期就是step1——step9
7、ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是什么?
當程序接到內存警告時View Controller將會收到這個消息:didReceiveMemoryWarning
從iOS3.0開始,不需要重載這個函數,把釋放內存的代碼放到viewDidUnload中去。
這個函數的默認實現是:檢查controller是否可以安全地釋放它的view(這里加粗的view指的是controller的view屬性),比如view本身沒有superview并且可以被很容易地重建(從nib或者loadView函數)。
如果view可以被釋放,那么這個函數釋放view并調用viewDidUnload。
你可以重載這個函數來釋放controller中使用的其他內存。但要記得調用這個函數的super實現來允許父類(一般是UIVIewController)釋放view。
如果你的ViewController保存著view的子view的引用,那么,在早期的iOS版本中,你應該在這個函數中來釋放這些引用。而在iOS3.0或更高版本中,你應該在viewDidUnload中釋放這些引用。
7.應用程序在啟動的時候主要做了什么操作?
答:應用程序在啟動的時候,會執行main函數,而main函數里面主要執行了UIApplicationMain函數。UIApplicationMain函數執行完主要做了以下三個操作:
(1)創建應用程序UIApplication對象。
(2)創建了應用程序代理對象。默認的應用程序代理對象是AppDelegate。
(3)建立一個事件循環RunLoop。用來實時監測應用程序中的各種事件(觸摸,晃動,遠程控制事件,通知,觀察者,timer等等)。
8.請描述一下viewController幾個重要方法的執行時機
答:視圖控制器的生命周期分為創建、 顯示 和 銷毀。
(1)創建
xxx *x = [[xxx ?alloc] init] ?//作用:分配內存空間,創建控制器時使用
(2)加載和顯示:
- (void)loadView: //作用:加載根視圖(即為self.view賦值),在控制器view屬性的getter方法首次調用的時候執行此方法。
根視圖已加載:
- (void)viewDidLoad// loadView執行完畢之后,立即執行此方法。作用:給創建好的控件設置值,做網絡請求,開啟timer等
loadView和viewDidLoad當首次訪問controller的根視圖時才會執行,即view屬性的getter方法首次使用時執行,loadView執行在前,viewDidLoad執行在后。
如果重寫了loadView一定要給控制器的根視圖賦值(self.view = xxView;),在給控制器的根視圖賦值的之前,不能使用控制器view屬性的getter方法,否則會重復執行loadView和viewDidLoad方法。
視圖將要顯示:
- (void)viewWillAppear:
視圖將要被添加到UI層級上,還沒有添加時執行。(此時視圖還沒有顯示)
視圖已經顯示:
- (void)viewDidAppear
視圖已經被添加到UI層級上,視圖已經顯示出來時執行。(視圖已經顯示)
視圖將要消失:
- (void)viewWillDisappear:
視圖將要被從UI層級上面移除,但視圖還沒有移除時執行。 (視圖還可見)
視圖已經消失:
- (void)viewDidDisappear:
視圖已經從UI層級上面移除,視圖已經不可見時執行。 (視圖不可見)
(3)銷毀:
- (void)viewWillUnload
iOS6.0之后已經被棄用。iOS 5.0之前,當低內存且控制器的view不需要使用的時候會調用這個方法,即當控制器的根視圖 將要 被釋放時執行([vc.view release],vc.view還未置空),我們可以在這個方法中移除一些跟視圖相關的觀察者和通知,并記錄視圖的狀態,以便之后重新創建視圖。iOS6.0之后不再需要做釋放了,該方法也被遺棄了。
- (void)viewDidUnload
iOS6.0之后已經被棄用。iOS 5.0之前,當低內存且控制器的view不需要使用的時候會調用這個方法,即當控制器的根視圖被釋放時執行([vc.view release],vc.view已經為nil),這個方法給我們一個機會做內存的相關清理工作,如果控制器對某些視圖有引用,可以在這里釋放這些引用,同樣可以釋放一些懶加載的對象,但是不要釋放那些不容易重新加載的數據。iOS6.0之后不再需要做釋放了,該方法也被遺棄了。
21.簡述應用程序按Home鍵進入后臺時的生命周期,以及從后臺回到前臺時的生命周期?
應用程序的狀態:
Not running:未運行,程序沒啟動
Inactive ? :未激活,程序在前臺運行,不過沒接受到事件,沒有事件處理的狀態下通常處于這個狀態。
Active ? ? ? ? :激活 ? 程序在前臺并且接收到了事件
Backgound :后臺 ? 程序在后臺而且能執行代碼,大多數程序進入這個狀態后會在在這個狀態上停留一會。
Suspended :掛起 ?程序在后臺不能執行代碼。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//告訴代理進程啟動但還沒進入狀態保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//告訴代理啟動基本完成程序準備開始運行
- (void)applicationWillResignActive:(UIApplication *)application
//當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
//當應用程序入活動狀態執行,這個剛好跟上面那個方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
//當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
//當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
//當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
//當程序載入后執行
22.描述應用程序的啟動順序。
①、程序入口main函數創建UIApplication實例和UIApplication代理實例
②、在UIApplication代理實例中重寫啟動方法,設置第一ViewController
③、在第一ViewController中添加控件,實現對應的程序界面。
23.ViewController的alloc,loadView。viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什么時候調用的?在自定義ViewController的時候這幾個函數里面應該做什么工作?(UI第三講 自定義視圖、視圖控制器)alloc初始化當前的ViewController
loadView:沒有正在使用nib視圖頁面,子類將會創建自己的自定義視圖層
viewDidLoad:試圖被加載后調用
viewWillAppear:試圖即將出現的時候調用
viewDidUnload:當系統內存吃緊的時候會調用該方法,釋放掉當前未在window中顯示的試圖和對應的控制器