標籤:應用程式
當剛開始學習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
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
簡析程式啟動原理