iOS-關於應用/檢視的生命週期及程式啟動原理小結
前言:
所有的移動作業系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止
還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate物件,讓delegate代理來處理這些系統事件
delegate可處理的事件包括:
- 應用程式的生命週期事件(如程式啟動和關閉)
- 系統事件(如來電)
- 記憶體警告
- …
應用的生命週期--->啟動過程:
應用啟動過程
這些UIApplicationDelegate,監聽應用程式的生命週期,監聽記憶體警告,系統事件
// 當應用程式啟動完畢的時候就會呼叫 (系統自動呼叫)
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"%s",__func__); return YES; }
// 即將失去活動狀態的時候呼叫(失去焦點, 不可互動)
- (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"%s",__func__); }
// 應用程式即將進入前臺的時候呼叫
// 一般在該方法中恢復應用程式的資料,以及狀態
- (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"%s",__func__); }
- // 應用程式進入後臺的時候呼叫
// 一般在該方法中儲存應用程式的資料, 以及狀態
- (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"Background"); }
// 重新獲取焦點(能夠和使用者互動)
- (void)applicationDidBecomeActive:(UIApplication *)
application { NSLog(@"%s",__func__); }// 應用程式即將被銷燬的時候會呼叫該方法
// 注意:如果應用程式處於掛起狀態的時候無法呼叫該方法
- (void)applicationWillTerminate:(UIApplication *)application { }
// 應用程式接收到記憶體警告的時候就會呼叫
// 一般在該方法中釋放掉不需要的記憶體
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { NSLog(@"%s",__func__); }
應用程式一般有五個狀態:官方文件app.states
程式啟動生命週期:--> (啟動過程)
A篇:啟動原理
① 執行main 函式,呼叫 main 函式裡的 UIApplicationMain 函式。intUIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName);
- argc、argv:直接傳遞給UIApplicationMain進行相關處理即可
- principalClassName:指定應用程式類名(app的象徵),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值
- delegateClassName:指定應用程式的代理類,該類必須遵守UIApplicationDelegate協議
② UIApplicationMain函式會根據principalClassName建立UIApplication物件,根據delegateClassName建立一個delegate物件,並將該delegate物件賦值給UIApplication物件中的delegate屬性
③ 接著會建立應用程式的Main Runloop(事件迴圈),進行事件的處理(首先會在程式完畢後呼叫delegate物件的application:didFinishLaunchingWithOptions:方法)
④ 程式正常退出時UIApplicationMain函式才返回
系統入口的程式碼和引數說明:
argc:系統或者使用者傳入的引數 argv:系統或使用者傳入的實際引數 1.根據傳入的第三個引數,建立UIApplication物件 2.根據傳入的第四個產生建立UIApplication物件的代理 3.設定剛剛創建出來的代理物件為UIApplication的代理 4.開啟一個事件迴圈(可以理解為裡面是一個死迴圈)這個時間迴圈是一個佇列(先進先出)先新增進去的先處理
B篇:(完整啟動過程)1.執行main 函式,呼叫 main 函式裡的 UIApplicationMain 函式。
2.建立UIApplication
① 開啟網頁,發簡訊,打電話
② 設定應用程式提醒數字
③ 設定聯網狀態
④ 設定狀態列3.建立AppDelegate代理物件,並且成為AppDelegate代理
① 監聽整個App的生命週期
② 處理記憶體警告4.開啟主運迴圈,保證程式一直執行
① 每一個執行緒都有runloop
② 主執行緒有一個runloop5.載入info.plist (判斷是否載入了main.storyboard)
情況1:--> 如果指定(沒有storyboard)
就會在application:didFinishLaunchingWithOptions:中
① 建立視窗
② 設定根控制器
③ 顯示視窗情況2:--> 如果載入的Info.plist檔案裡的Main storyboard:
系統會自動呼叫 (不用我們管)
① 建立視窗
② 載入main.storyboard,並且載入main.storyboard指定的控制器
③ 把新建立的控制器,作為視窗的根控制器,讓視窗顯示出來
如圖:
程式啟動過程
檢視的生命週期--->view:
檢視的生命週期
- 1、 alloc 建立物件,分配空間
- 2、 init (initWithNibName) 初始化物件,初始化資料
- 3、 loadView 從nib載入檢視 ,除非你沒有使用xib檔案建立檢視
- 4、 viewDidLoad 載入完成,可以進行自定義資料以及動態建立其他控制元件
- 5、 viewWillAppear檢視將出現在螢幕之前,馬上這個檢視就會被展現在螢幕上了
- 6、 viewDidAppear 檢視已在螢幕上渲染完成
- 7、viewWillDisappear 檢視將被從螢幕上移除之前執行
- 8、viewDidDisappear 檢視已經被從螢幕上移除,使用者看不到這個檢視了
- 9、dealloc 檢視被銷燬,此處需要對你在init和viewDidLoad中建立的物件進行釋放.
- 10、viewVillUnload- 當記憶體過低,即將釋放時呼叫;
- 11、viewDidUnload-當記憶體過低,釋放一些不需要的檢視時呼叫。