天天看點

iOS的程式啟動原理

大家在寫iOS程式的過程中一般是通過向導,生成項目,然後通過模拟器啟動應用程式。但我們肯定會對它背後的啟動過程感到好奇,比如點選程式圖示啟動程式開始到退出程式整個程式運作過程中底層到底做了什麼?

一、程式啟動原理

1.

首先找到程式入口,執行main函數

main -> UIApplicationMain

2.

UIApplicationMain底層做事情

1> 建立UIApplication對象

2> 建立UIApplication的代理對象,而且給UIApplication對象代理屬性指派

3> 開啟主運作循環,作用接收事件,讓程式一直運作

4> 加載info.plist,判斷下有木有指定main.storyboard,如果指定就會去加載

3.建立UIWindow

1> 加載info.plist,判斷有沒有指定main.storyboard,指定了main.storyboard,就會去加載main.storyboard,執行main.storyboard的時候建立視窗,加載控制器,設定視窗的根控制器,顯示視窗。

2> 在加載info.plist檔案之後,如果沒有指定main.storyboard,會在程式啟動完成的時候建立視窗。 (

手動建立視窗

1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // 視窗顯示的注意點:
 3     // 1.一定要強引用
 4     // 2.控件要想顯示出來,必須要有尺寸
 5 
 6     // 1.建立視窗
 7     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
 8 
 9     // 2.建立根控制器,在設定視窗的根控制器
10     UIViewController *vc = [[UIViewController alloc] init];
11 
12     // 設定視窗的根控制器,底層會自動把根控制器的view添加到視窗上,并且讓控制器的view有旋轉功能
13     self.window.rootViewController = vc;
14 
15     // 3.顯示視窗
16     // makeKeyAndVisible:讓視窗成為應用程式的主視窗,并且顯示視窗
17     [self.window makeKeyAndVisible];
18 
19     return YES;
20 }      

程式啟動官方文檔:

二、UIApplication

1> UIApplication對象是應用程式的象征

2> 每一個應用都有自己的UIApplication對象,而且是單例的。通過[UIApplication sharedApplication]可以獲得這個單例對象。

3> 一個iOS程式啟動後建立的第一個對象就是UIApplication對象

4> 利用UIApplication對象,能進行一些應用級别的操作

1.應用程式圖檔的提醒數字

1    // 擷取應用程式的象征
 2    UIApplication *app =  [UIApplication sharedApplication];
 3 
 4     // 應用程式圖檔的提醒數字
 5     app.applicationIconBadgeNumber = 100;
 6 
 7     // 建立通知對象
 8     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
 9     // 注冊使用者通知
10     [app registerUserNotificationSettings:settings];      

2.聯網狀态

1     // 聯網狀态
2     app.networkActivityIndicatorVisible = YES;      

3.打開資源,電話,網頁,發短信

1 // 打開網頁
2 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
3 [app openURL:url];      

4.設定狀态欄

 在iOS7之後,狀态欄預設交給控制器處理

1 // 狀态欄的隐藏
 2 - (BOOL)prefersStatusBarHidden
 3 {
 4     return YES;
 5 }
 6 // 狀态欄的樣式
 7 - (UIStatusBarStyle)preferredStatusBarStyle
 8 {
 9     return UIStatusBarStyleLightContent;
10 }      

那麼在iOS7之後如何設定

用UIApplication對象管理狀态欄:

(在info.plist中添加一個字典View controller-based status bar appearance = NO)

使用UIApplication對象管理狀态欄的好處:  1.統一管理.(控制器很多的情況下用控制器不好管理)

//    app.statusBarHidden = YES;      

 2. 隐藏狀态欄可以設定動畫

1   [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];      

三、UIApplication的代理

1.在app受到幹擾時,會産生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件

2.delegate可處理的事件包括:

2.1應用程式的生命周期事件(如程式啟動和關閉)

2.2系統事件(如來電)

2.3記憶體警告

3.delegate什麼時候調用:

1 // app啟動完成的時候調用
 2 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 3 
 4     NSLog(@"%s",__func__);
 5 
 6     return YES;
 7 }
 8 
 9 // app即将失去焦點的時候調用
10 - (void)applicationWillResignActive:(UIApplication *)application {
11     NSLog(@"%s",__func__);
12 }
13 
14 // app進入背景
15 - (void)applicationDidEnterBackground:(UIApplication *)application {
16    NSLog(@"%s",__func__);
17     // 儲存一些資料
18 }
19 
20 // app即将進入前台的時候調用
21 - (void)applicationWillEnterForeground:(UIApplication *)application {
22     NSLog(@"%s",__func__);
23 }
24 
25 // app即将擷取焦點的時候
26 // 當應用程式擷取焦點的時候才能夠與使用者互動
27 - (void)applicationDidBecomeActive:(UIApplication *)application {
28     NSLog(@"%s",__func__);
29 }
30 
31 // app關閉的時候調用
32 - (void)applicationWillTerminate:(UIApplication *)application {
33 
34 }
35 
36 // 監聽記憶體警告
37 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
38 {
39     NSLog(@"記憶體警告");
40     // 清楚圖檔緩存
41 }      

四、iOS啟動過程邏輯回顧

---恢複内容結束---