iOS APP 生命週期

來源:互聯網
上載者:User

標籤:

官方文檔:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW1

 

基本要點:

一 入口函數為main函數,一般不需要更改;

發散點:看main函數,可以注意到加上了@autoreleasepool. 實際上如果在啟動子線程的時候,也需要作類似處理,以保證放入auto release pool的對象能被及時釋放.

 

二 The Main Run Loop 主運行迴圈

Main Run Loop負責處理使用者相關的事件。UIApplication對象在程式啟動時啟動main run Loop,它處理事件和更新視圖的介面, 是運行在程式的主線程上的。

發散點:NSRunLoop的學習與使用. 

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode

                                     beforeDate:[NSDate dateWithTimeIntervalSinceNow:5]];

 

三 App States (應用程式狀態)

1 Not running 未運行:程式沒啟動或者被系統終止;

2 Inactive 未啟用:程式在前台運行,不過沒有接收到事件。應用處於這個狀態時,很多時候僅僅是當時正要轉向另一個狀態;

3 Active 啟用:程式在前台運行而且接收到了事件。這也是前台的一個正常的模式。

4 Background 後台:程式在後台而且能執行代碼。應用程式進入這個狀態多半是因為要進入Suspended狀態;應用程式在從Background轉向Suspended狀態之前可以請求額外的時間來完成一些背景處理。In addition, an app being launched directly into the background enters this state instead of the inactive state.

5 Suspended 掛起:程式在後台不能執行代碼。系統會自動把程式變成這個狀態而且不會發出通知。當掛起時,程式還是停留在記憶體中的,當系統記憶體低時,系統就把掛起的程式清除掉,為前景程式提供更多的記憶體。

四 程式切換時AppDelegate收到的回調

  • application:willFinishLaunchingWithOptions: 應用程式啟動時調用.一般不需要做特殊處理.

  • application:didFinishLaunchingWithOptions: 應用啟動時調用,此時應用還沒有展示給使用者,停留在所謂的開機畫面頁,在這個方法中做一些必要的初始化操作,以前沒有設定main story board進入的時候,是需要通過代碼來alloc window並設定root view controller的. 注意在該方法中不要執行耗時操作,比如大量的IO操作等等,因為如果較長時間這個方法還沒有執行完畢(測試的時候大概是30s左右),iOS會殺掉進程的.

  • applicationDidBecomeActive:應用程式進入到Active狀態,意味著應用將要切換到前台.

  • applicationWillResignActive:當應用程式將要入非使用中執行,在此期間,應用程式不接收訊息或事件,比如來電話

  • applicationDidEnterBackground:應用程式已經進入後台狀態.

  • applicationWillEnterForeground: 應用程式將要進入前台的時候調用,在這個時候還沒有變成Active狀態.

  • applicationWillTerminate:應用程式將要被系統終止,注意,如果應用已經是Suspended狀態下這個方法不會被調用,所以如果想在程式被殺掉之前儲存一些資料的話,需要注意盡量避免在這個方法中去做資料儲存的事情

此外,還有方法

- (void)applicationDidFinishLaunching:(UIApplication *)application;

但是SDK文檔明確說明,應該用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions替代.

 

五 在實際開發過程中,我們發現,在iOS 7和iOS 8 上,root view controller的viewDidLoad和

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中的方法執行的先後順序是不同的,也沒有看到明確的文檔說明,可能也和設定root view controller的方式有關。

當時遇到的問題是,在root view controller的viewDidload方法中通過addObserver來觀察一個背景工作是否執行完成;而這個背景工作在didFinishLaunchingWithOptions中啟動。在iOS 7 上, viewDidload會在構造root view controller之後被先執行,這樣addObserver會在背景工作發送訊息之前先執行,整個流程沒問題;但是iOS 8上,背景工作可能都已經執行完了,postNotification已經調用過了,root view controller的viewDidLoad還沒有開始調用,導致addObserver沒被調用而導致bug。

所以,建議兩者之間不要有強關聯,不要互相依賴對方的執行。

 

六 在applicationDidEnterBackground時,如果還希望長時間的運行任務,可以調用下面的方法:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

          NSLog(@"startBackgroundTask time out");

    // do something .....

    }];

除此以外,在執行這些回呼函數的時候,應該儘快的執行完畢並返回。

iOS APP 生命週期

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.