參考自滾滾貓的《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)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
內存警告