一、UIApplication Delegate 1、基本介紹 所有的移動操作系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止。 還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的 ...
一、UIApplication Delegate
1、基本介紹
所有的移動操作系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止。
還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件。包括:
(1)應用程式的聲明周期事件(如程式啟動和關閉)
(2)系統事件(如來電)
(3)記憶體警告
作用:當被打斷的時候,通知代理進入到後臺。
2、代碼
1 #import "AppDelegate.h" 2 3 @interface AppDelegate () 4 5 @end 6 7 @implementation AppDelegate 8 9 // 當應用程式啟動完畢的時候就會調用(系統自動調用) 10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 11 NSLog(@"didFinishLaunchingWithOptions"); 12 return YES; 13 } 14 // 即將失去活動狀態的時候調用(失去焦點, 不可交互) 15 - (void)applicationWillResignActive:(UIApplication *)application { 16 NSLog(@"WillResignActive"); 17 } 18 // 應用程式進入後臺的時候調用,一般在該方法中保存應用程式的數據, 以及狀態。 19 - (void)applicationDidEnterBackground:(UIApplication *)application { 20 NSLog(@"DidEnterBackground"); 21 } 22 // 應用程式即將進入前臺的時候調用,一般在該方法中恢復應用程式的數據,以及狀態 23 - (void)applicationWillEnterForeground:(UIApplication *)application { 24 NSLog(@"WillEnterForeground"); 25 } 26 // 重新獲取焦點(能夠和用戶交互) 27 - (void)applicationDidBecomeActive:(UIApplication *)application { 28 NSLog(@"DidBecomeActive"); 29 } 30 //應用程式即將被銷毀的時候會調用該方法, 31 //註:如果應用程式處於掛起狀態(程式未處於運行狀態,但也沒有被結束,只是暫時凍結)的時候無法調用該方法 32 - (void)applicationWillTerminate:(UIApplication *)application { 33 NSLog(@"WillTerminate"); 34 } 35 // 應用程式接收到記憶體警告的時候就會調用,一般在該方法中釋放掉不需要的記憶體(大部分是圖片緩存) 36 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 37 { 38 NSLog(@"DidReceiveMemoryWarning"); 39 } 40 @end
打開App時候調用
2016-04-29 18:13:10.814 4.29UIApplication Delegate[12099:1953043] didFinishLaunchingWithOptions 2016-04-29 18:13:10.835 4.29UIApplication Delegate[12099:1953043] DidBecomeActive
App進入後來的時候調用
2016-04-29 18:15:11.888 4.29UIApplication Delegate[12099:1953043] WillResignActive
2016-04-29 18:15:12.457 4.29UIApplication Delegate[12099:1953043] DidEnterBackground
重新進入App時候調用
2016-04-29 18:15:54.764 4.29UIApplication Delegate[12099:1953043] WillEnterForeground
2016-04-29 18:15:55.281 4.29UIApplication Delegate[12099:1953043] DidBecomeActive
二、UIApplicationMain
1、啟動原理
程式打開後會先進入main函數,執行UIApplicationMain函數
代碼如下:(在main.m中)
#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); // // argc: 系統或者用戶傳入的參數個數 // argv: 系統或者用戶傳入的實際參數 // 1.根據傳入的第三個參數創建UIApplication對象 // 2.根據傳入的第四個產生創建UIApplication對象的代理 // 3.設置剛剛創建出來的代理對象為UIApplication的代理 // 4.開啟一個事件迴圈 } }
即
2、UIApplicationMain的底層實現:
(1)根據principalClassName提供類名,創建UIApplication對象
(2)創建UIApplicationDelegate對象,並且成為UIApplication對象代理,app.delegate = delegate
(3)開啟一個主運行迴圈,處理事件,可以讓程式保持運行
(4)載入info.plist,並且判斷有沒有指定main.storyboard,如果指定,就會去載入
3、程式啟動的完整過程:
(1)執行main函數
(2)執行UIApplicationMain 函數
創建UIApplication對象
創建UIApplication的delegate對象
(3)根據Info.plist獲得最主要storyboard的文件名,載入最主要的storyboard(有storyboard)
創建UIWindow
創建和設置UIWindow的rootViewController
顯示視窗
(3)delegate對象開始處理(監聽)系統事件(沒有storyboard)
程式啟動完畢的時候, 就會調用代理的didFinishLaunchingWithOptions方法
需要手動在didFinishLaunchingWithOptions創建UIWindow
創建和設置UIWindow的rootViewController
顯示視窗
代碼如下(在AppDelegate.m中):
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 //創建視窗 3 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 4 //載入storyBoard,後面的Main首字母是大寫的!! 5 //nil當作為參數的時候表示NSBundle mainBundle 6 UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 7 //通過storyBoard創建一個控制器 8 UIViewController *viewController = [storyBoard instantiateInitialViewController]; 9 self.window.rootViewController = viewController; 10 //顯示視窗 11 [self.window makeKeyAndVisible]; 12 return YES; 13 }
註:手動創建storyBoard之前註意要刪除Main