應用程序啟動過程:
- 找到main.m 文件
- 執(zhí)行main函數(shù)
- 執(zhí)行UIApplicationMain()函數(shù)
- 實例化UIApplication對象 --> 繼承自 UIApplication
設置UIApplication的代理 --> AppDelegate 如果需要自定義需要 遵守 UIApplicationDelegate
開啟一個主循環(huán) --> 監(jiān)聽用戶的交互事件 --> 直到應用程序結(jié)束之后才會停止
檢測是否存在sb
-
如果存在
- 實例化一個UIWindow對象
- 實例化箭頭所指的控制器器
- 實例化控制器的view和子view
- 設置控制器成為window的根控制器
- 讓window 可見
調(diào)用AppDelegate的方法
didFinishLaunchWithOpitons: 完成啟動 -
如果不存在sb
直接調(diào)用AppDelegate的方法
didFinishLaunchWithOpitons: 完成啟動
didFinishLaunchWithOpitons:- 實例化UIWindow, 賦值 給 self.window
- 實例化一個ViewController
- 設置self.window.roothViewController =
代碼示例
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
實例化一個window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];-
實例化控制器
// 如果存在和類名相同的xib , 通過 alloc init 方法,內(nèi)部會優(yōu)先加載xib
TestViewController *controller = [[TestViewController alloc] init]; 設置window的根控制器
self.window.rootViewController = controller;讓window成為主窗口并可見
[self.window makeKeyAndVisible];
return YES;
}
創(chuàng)建控制器的多種方式
/**
第一種方式: 使用class 創(chuàng)建控制器
ViewController *controller = [[ViewController alloc] init];
*/
/**
第二種方式: 使用storyboard
// 實例化 storyboard對象
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 取出storyboard中的 控制器 , 使用這種方式實例化控制器的時候, 箭頭必須在,如果不存在, 就會加載不到控制器
UIViewController *controller = [storyboard instantiateInitialViewController];
*/
/**
第三種: 通過 storyboard 的 storyboard ID
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"bigfang"];
*/
/**
第四種: 加載xib
UIViewController *controller = [[NSBundle mainBundle] loadNibNamed:@"LoadXib" owner:nil options:nil].lastObject;
*/
/**
第五種: 實例化xib
在xib中沒有view存在
reason: '-[UIViewController _loadViewFromNibNamed:bundle:] was unable to load a nib named "IntinalTest"'
view沒有進行關聯(lián)
reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "IntinalTest" nib but the view outlet was not set.'
UIViewController *controller = [[UIViewController alloc] initWithNibName:@"IntinalTest" bundle:nil];
*/
/**
第六種: 和同類名xib
// 如果存在和類名相同的xib , 通過 alloc init 方法,內(nèi)部會優(yōu)先加載xib
TestViewController *controller = [[TestViewController alloc] init];
*/