程序猿們,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中顯示的試圖和對應的控制器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章