IOS 生命周期

參考自滾滾貓的《iOS APP生命周期 和 UIViewController的生命周期》,滄州寧少的《iOS App生命周期》。

1.如果創建視圖對象使用的是[[MyViewController alloc] init],執行順序是init->viewDidLoad,但如果我在MyViewController.m中重寫了init,并且在init方法中寫入了涉及視圖(self.view等)屬性的代碼,就會在該處暫停init的執行,而去執行viewDidLoad,然后再回來執行init,(注意viewDidLoad在視圖生命周期中只執行一次),所以不要再重寫的init中加入視圖相關代碼。


APP的生命周期:

一:應用的五種狀態

1.未運行(Not running)狀態:程序沒啟動。

2.未激活(Inactive)狀態:程序在前臺運行,不過沒有接收到事件。

一般每當應用要從一個狀態切換到另一個不同的狀態時,中途過渡會短暫停留在此狀態。唯一在此狀態停留時間比較長的情況是:當用戶鎖屏時,或者系統提示用戶去響應某些(諸如電話來電、有未讀短信等)事件的時候。

3.激活(Active):程序在前臺運行而且接收到了事件。這也是前臺的一個正常的模式。

4.后臺(Backgroud):程序在后臺而且能執行代碼,大多數程序進入這個狀態后會在在這個狀態上停留一會。時間到之后會進入掛起狀態(Suspended)。有的程序經過特殊的請求后可以長期處于Backgroud狀態。

5.掛起(Suspended):程序在后臺不能執行代碼。系統會自動把程序變成這個狀態而且不會發出通知。當掛起時,程序還是停留在內存中的,當系統內存低時,系統就把掛起的程序清除掉,為前臺程序提供更多的內存。

二:函數執行順序

1.首先執行的是main.m類中的main函數。

這個函數的主要作用是創建一個UIApplication對象,創建它對應的一個代理對象,開啟RunLoop運行循環,如果UIStoryBoard存在的話,則從UIStoryBoard中加載用戶界面。

在應用程序啟動的時候,UIApplication會初始化一些核心對象,并啟動運行。UIApplication對象是每個iOS的核心對象。負責幫助iOS系統和其他對象之間的交互.列表列舉一下每個對象,UIApplication 管理事件循環和高層組件的行為,負責完成iOS系統和我們定義對象的交互。UIAppdelegate 監聽Application中各種狀態,Documents和Data Objects 數據模型對象存儲應用的內容,針對特定應用的。

UIViewController 視圖管理器管理應用程序內容在屏幕上的顯示。視圖控制器管理著一個根視圖和一個子視圖的集合。視圖控制器通過把視圖View安裝到UIWindow上以展示在屏幕上。UIViewController是所有視圖控制器的基類。封裝了類似屏幕旋轉。視圖展示等一些列的操作。

UIWindow 窗口對象UIWindow。協調屏幕上一個或者多個視圖的展示。 大多數應用只有一個窗口。有一些應用有更多的窗口。但應用程序可能額外的窗口,用于在有外接顯示器上顯示內容。窗口內容從來不會被替換。屏幕內容的改變都是通過視圖控制器來完成的。除了管理視圖。窗口對象和UIApplication傳遞事件到UIView和CALayer.

UIView/CALayer? 視圖和控件提供可視化的展示。層對象實際上是代表視覺內容的數據對象,視圖會大量的使用層對象來控制內容。



主運行循環

應用程序的運行循環處理所有與用戶相關的事件。UIApplication對象在應用啟動的時候運行循環,用來處理事件和視圖的更新。顧名思義,各種事件在主運行循環串行執行。保證了執行的先后順序。

用戶和設備交互的事件是由操作系統產生的,這些事件發生到UIKit會建立一個端口。事件會在一個事件隊列中排序。逐個分發。一個觸摸(Touch)事件通常先分發到主窗口對象,然后依次分發到觸摸事件發生的視圖。但是這些事件并非是通過主運行循環進行分發。有些事件發生到代理對象和函數對象中。iOS中主要的事件類型包括:觸摸事件,遠程控制事件,搖晃事件,加速器事件,定位。







2.然后依次執行:

application:willFinishLaunchingWithOptions:

在App啟動時調用表示應用加載進程已經開始,常用來處理應用狀態的存儲和恢復。

application:didFinishLaunchingWithOptions:

表示App將從未運行狀態進入運行狀態,用于對App的初始化操作。

applicationDidBecomeActive:

當應用即將進入前臺運行時調用。

applicationWillResignActive:

當應用即將進從前臺退出時調用。

applicationDidEnterBackground:

當應用開始在后臺運行的時候調用。

applicationWillEnterForeground:

當程序從后臺將要重新回到前臺(但是還沒變成Active狀態)時候調用。

applicationWillTerminate:

當前應用即將被終止,在終止前調用的函數。通常是用來保存數據和一些退出前的清理工作。如果應用當前處在suspended,此方法不會被調用。 該方法最長運行時限為5秒,過期應用即被kill掉并且移除內存。


狀態轉換

三:一些APP的生命周期的場景

1、程序啟動:狀態由Not running -> Inactive -> Active

willFinishLaunchingWithOptions

didFinishLaunchingWithOptions

applicationDidBecomeActive

2、點擊home鍵|鎖屏:由Active -> Inactive -> Backgroud

applicationWillResignActive

applicationDidEnterBackground

3、重新進入前臺:Backgroud -> Inactive -> Active?

applicationWillEnterForeground

applicationDidBecomeActive

4、在前臺,雙擊home鍵,手動殺掉APP:Active -> Inactive -> Backgroud -> end

applicationWillResignActive

applicationDidEnterBackground

applicationWillTerminate

5、當URL到達時,如果你的應用沒在正在運行,則會被啟動并且移到前臺運行以打開URL

application:didFinishLaunchingWithOptions:

application:openURL:sourceApplication:

applicationDidBecomeActive

6、當URL到達時,如果你的應用正在background運行或被suspended,它將會被移到前臺以打開URL

applicationWillEnterForeground

application:openURL:sourceApplication:

applicationDidBecomeActive


一個比較全面生命周期執行流程圖:


生命周期執行流程

UIViewController的生命周期:

編譯時:

+(void)load

只要類所在文件被引用就會被調用,方法只會被調用一次。

+(void)initialize

類或者其子類的第一個方法被調用前調用,方法只會被調用一次。

當一個視圖控制器被創建,并在屏幕上顯示的時候。 代碼的執行順序

1、 alloc

創建對象,分配空間

2、init (initWithNibName|initWithCoder)

初始化對象,初始化數據

3、awakeFromNib

所有視圖的outlet和action已經連接,但還沒有被確定。

4、loadView

完成一些關鍵view的初始化工作,加載view。

5、viewDidLoad

載入完成,可以進行自定義數據以及動態創建其他控件

6、viewWillAppear

視圖將出現在屏幕之前

7、viewWillLayoutSubviews

將要對子視圖進行調整

8、viewDidLayoutSubviews

對子視圖進行調整完畢

9、viewDidAppear

視圖已在屏幕上渲染完成

10、viewWillDisappear

視圖將被從屏幕上移除

11、viewDidDisappear

視圖已經被從屏幕上移除

12、dealloc

視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放

13、didReceiveMemoryWarning

內存警告




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

推薦閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數據結構(3).初始化時...
    歐辰_OSR閱讀 29,547評論 8 265
  • load初始化方法<加載到內存就會執行,不需要觸發,且只會調用一次> + (void)load 只要加載內存中就會...
    flowerflower閱讀 738評論 1 2
  • ViewController生命周期 按照執行順序排列: initWithCoder:通過nib文件初始化時觸發。...
    隱身人閱讀 694評論 3 7
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,135評論 1 32
  • 致萬丈紅塵一匠人 敬詩美情深有真心 余百年清香文人魂 光耀天地暖人間身 中有千結與君夢聞
    Doris十三閱讀 213評論 0 0