app程序入口main
在我們開始開發(fā)app的時候马昨,第一步往往是通過設置AppDelegate.m 的代理方法開始寫一些啟動的東西
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
然后再通過控制器ViewController.m
- (void)viewDidLoad;
實現(xiàn)一些布局那么在這些步驟之前做了什么呢胸懈?真正的app程序入口是通過工程根目錄下Supporting Files里的main.m執(zhí)行的
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
1.了解UIApplicationMain方法
- 通過日常的開發(fā)社露,大家可以猜測到UIApplicationMain執(zhí)行的是一個死循環(huán)方法,驗證代碼如下:
int main(int argc, char * argv[]) {
@autoreleasepool {
NSLog(@"開始運行app");
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
NSLog(@"app結束"); //@"app結束"永遠不會被執(zhí)行
return 0;
}
}
- 通過UIApplicationMain的官方描述可以了解到
執(zhí)行順序如下:
1.創(chuàng)建一個application對象
2.設置了代理
3.創(chuàng)建了一個事件循環(huán)(Runloop害捕,第二篇分析源碼)
4.讀取info.plist文件(只讀)
5.創(chuàng)建了一個window
6.加載第一個控制器 (默認是Main故事版)
UIApplicationMain參數(shù)的意義
- 通過修改參數(shù)可以進入自己創(chuàng)建AppDelegate
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([CustomAppDelegate class]));
}
}
- UIApplicationMain中的nil參數(shù)默認為系統(tǒng)的
UIApplication
所以可以通過修改nil參數(shù)茶凳,實現(xiàn)進入自己定義的UIApplication類,如下
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, @"wfCustomApplication", NSStringFromClass([CustomAppDelegate class]));
}
}
2.info.plist與啟動
- 通過info.plist的key
Main storyboard file base name
尋找是否Main,有則進入Main storyboard. - 如果沒有給值说墨,則跳轉至自己設置在
keywindow
上ViewController
- 如果沒有給值胖笛,也沒有在window上設置控制器,那么啟動app失敗画切,進入黑屏模式
- 如果設置了Main竣稽,又在window上設置了別的控制器。那么在一個app上會存在兩個window霍弹,會存在潛在的bug
總結
- UIApplicationMain底層實現(xiàn):
根據(jù)principalClassName傳遞的類名創(chuàng)建UIApplication對象
創(chuàng)建UIApplication代理對象毫别,給UIApplication對象設置代理
開啟主運行時間循環(huán)Runloop,處理事件典格,保持程序一直運行
加載info.plist岛宦,判斷下是否指定了main,如果指定了耍缴,就會去加載