程序猿們,iOS中是有生命週期的
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原來的狀態。
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:<iOS6之後廢棄>當系統內存吃緊的時候會調用該方法,釋放掉當前未在window中顯示的試圖和對應的控制器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.