应用程序启动过程:
- 找到main.m 文件
- 执行main函数
- 执行UIApplicationMain()函数
- 实例化UIApplication对象 --> 继承自 UIApplication
设置UIApplication的代理 --> AppDelegate 如果需要自定义需要 遵守 UIApplicationDelegate
开启一个主循环 --> 监听用户的交互事件 --> 直到应用程序结束之后才会停止
检测是否存在sb
-
如果存在
- 实例化一个UIWindow对象
- 实例化箭头所指的控制器器
- 实例化控制器的view和子view
- 设置控制器成为window的根控制器
- 让window 可见
调用AppDelegate的方法
didFinishLaunchWithOpitons: 完成启动 -
如果不存在sb
直接调用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 方法,内部会优先加载xib
TestViewController *controller = [[TestViewController alloc] init]; 设置window的根控制器
self.window.rootViewController = controller;让window成为主窗口并可见
[self.window makeKeyAndVisible];
return YES;
}
创建控制器的多种方式
/**
第一种方式: 使用class 创建控制器
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没有进行关联
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 方法,内部会优先加载xib
TestViewController *controller = [[TestViewController alloc] init];
*/