簡析程式啟動原理

來源:互聯網
上載者:User

標籤:應用程式

當剛開始學習ios開發的時候,我們學會做的第一件事就是建立一個新的項目。每次我都會好奇,為什麼我們選擇建立一個Single View Application項目的時候,什麼代碼都不用敲就可以在模擬器上運行程式了。要解答這個問題需要明白一點程式的啟動原理,看完之後你就會明白。

首先,建立一個Single View Application項目以方便我們的研究。可以明確的是,不論是C語言還是Objiective-C語言程式,程式啟動並執行入口都是main函數。所以我們從main函數開始入手。


建立新項目


main函數

看不懂這個main函數裡面的代碼?

int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );

按住Option鍵點擊這個方法UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])),通過Apple的官方協助文檔,我們來瞭解這個函數。
主要解析函數的後兩個參數:

參數 說明
principalClassName 指定應用程式類名(app的象徵),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值
delegateClassName 指定應用程式的代理類,該類必須遵守UIApplicationDelegate協議

總結一下這個函數的作用,按照啟動並執行過程,大概有四點:

  • 根據principalClassName執行個體化一個UIApplication類或其子類的對象,根據delegateClassName建立一個delegate對象,並將這個delegate對象賦值給UIApplicationd對象的delegate屬性。
  • 接著會建立應用程式的Main Runloop(事件迴圈),進行事件的處理。
  • 如果應用的info.plist檔案中,一個描述主nib檔案裡有關鍵字,且這個關鍵字對應了可用的nib檔案就載入這個檔案。(如果沒有,就會在程式完畢後調用delegate對象的application:didFinishLaunchingWithOptions:方法)
  • 程式正常退出時UIApplicationMain函數才返回

什麼是UIApplication類?我們不糾結,你需要知道的是,UIApplication對象是應用程式的象徵,所以每一個應用都有自己的UIApplication對象,而且是單例的(也就是說一個應用中只有一個UIApplication對象),利用UIApplication對象,能進行一些應用層級的操作
。最重要的是,根據對main函數的研究,可以得出結論,UIApplication對象是程式建立的第一個對象!

重點來看這一條:

  • 如果應用的info.plist檔案中,一個描述主nib檔案裡有關鍵字,且這個關鍵字對應了可用的nib檔案就載入這個檔案。(如果沒有,就會在程式完畢後調用delegate對象的application:didFinishLaunchingWithOptions:方法)

找到infp.plist檔案,,我們找到了main這個關鍵字。因為它的存在,我們的程式會去載入main.storyboard這個檔案,程式啟動完成之後,我們就在模擬器的介面上看到了它白色的View。


Info.plist檔案

,假如我們刪掉這個main,其實就是刪掉了info.plist檔案裡面的main關鍵字。再運行程式,你會發現你的模擬器黑洞洞一片,什麼都沒有了。


把紅框框裡的main刪掉!

那麼,程式到這裡到底是怎麼啟動並執行呢?
注意上面那條括弧裡面的文字。如果你瞭解代理機制:成為了某個對象的代理,就要遵守它的代理協議,根據這份協議,就知道有些方法需要你去實現。這就是兩個AppDelegate檔案的由來--原來他們就是來實現UIApplicationDelegate代理方法的。看下面的圖,


AppDelegate.m檔案裡自動產生的代理方法

我們已經知道,當應用啟動完成後會調用delegate對象的application:didFinishLaunchingWithOptions:方法,那麼我們嘗試在這個方法裡面寫一些代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.    // 1.建立視窗    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];    // 2.載入storyboard檔案,建立控制器    // name:就是storyboard檔案名稱    // bundle:主bundle,傳入nil,表示主bundle    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];    // 通過storyboard對象建立控制器    // instantiateInitialViewController:載入storyboard箭頭指向的控制器    UIViewController *rootVc = [storyboard instantiateInitialViewController];    // 3.設定視窗的根控制器,並且顯示視窗    self.window.rootViewController = rootVc;    // 4.顯示視窗    [self.window makeKeyAndVisible];    return YES;}

再重新運行程式,你會發現,你的模擬器介面又變白了。沒錯,你看到的還是main.storyboard檔案裡的控制器的view。也就是說,如果我們什麼都不改變,Xcode會自動幫我們產生這些代碼。暫時不要糾結這些代碼,讓你理解這整個流程是這篇文章的關鍵,相信會對你以後的學習帶來協助。

希望可以協助到你,有問題可以關注我哦,我們一起coding

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

簡析程式啟動原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.