以上是Xcode4.2中不采用storyboard应用的默认启动流程图。对于采用了storyboard的应用,UIApplicationMain()
将会额外加载应用的主要storyboard文件,从而创建窗口和初始视图。
程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
一、UIApplicationMain这个函数主要负责三件 事情:
1)从给定的类名初始化应用程序对象,也就是初始化UIApplication或者子类对象的一个实例,如果你在这里给定的是nil,那么 系统会默认UIApplication类,也就主要是这个类来控制以及协调应用程序的运行。在后续的工作中,你可以用静态方法sharedApplication 来获取应用程序的句柄。
2)从给定的应用程序委托类,初始化一个应用程序委托(UIApplicationDelegate)。并把该委托设置为应用程序的委托,这里就有如果传入参数为nil,会调用函数访问 Info.plist文件来寻找主nib文件,获取应用程序委托。
3)启动主事件循环,并开始接收事件。
二、UIApplication(或 者子类)对象的职责,这个对象主要做下面几件事:
1)负责处理到来的用户事件,并分发事件消息到应该处理该消息的目标对象(sender, action)。
2)管理以及控制视图,包括呈现、控制行为、当前显示视图等。
3)该对象有一个应用程序委托对象,当一些生命周期内重要事件(可以包括系统事件或者生命周期控制事件)发生时,应用程序通知该对象。例如,应用程序启 动、内存不够了或者应用程序结束等,让这些事件发生时,应用程序委托去响应。
UIApplication有以下成员变量
1、sharedApplication类方法获取当前程序的UIApplication实例
2、delegate属性获取UIApplicationDelegate实现类的实例
3、windows属性获取当前程序涉及到窗口类数组
4、keyWindow属性获取当前程序关键窗口
所以当前的windows存放在UIApplication中。
以上流程图是没有加载sb的,以下是加载sb的流程:
--.UIApplicationMain函数里面做了什么事情:
3.创建UIApplication的delegate对象-----XXAppDelegate;
* 每监听到对应的系统事件时,就会通知MJAppDelegate;
8.加载最主要的storyboard文件,创建白色箭头所指的控制器对象;
9.并且将8步奏里创建的控制器为UIWindow的rootViewController属性(根控制器);
10.展示UIWindow,展示之前会将添加rootViewController的view到UIWindow上面(在这一步才会创建控制器的view)
[window addSubview: window.rootViewControler.view];
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- [self.window addSubview:tableViewController.view];
- [self.window makeKeyAndVisible];
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- [self.window addSubview:tableViewController.view];
- [self.window makeKeyAndVisible];
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- NSLog(@"here1");
- NSLog(@"%@",self.window);
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- NSLog(@"here2");
- [self.window addSubview:tableViewController.view];
- NSLog(@"here3");
- return YES;
- }
- 2014-09-20 16:30:22.066 Refer[3253:60b] ViewController : initWithCoder:
- 2014-09-20 16:30:22.074 Refer[3253:60b] here1
- 2014-09-20 16:30:22.077 Refer[3253:60b] <UIWindow: 0x14db9020; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x14db9cb0>; layer = <UIWindowLayer: 0x14dbb910>>
- 2014-09-20 16:30:22.079 Refer[3253:60b] here2
- 2014-09-20 16:30:22.091 Refer[3253:60b] TableViewController : viewDidLoad
- 2014-09-20 16:30:22.095 Refer[3253:60b] here3
- 2014-09-20 16:30:22.104 Refer[3253:60b] ViewController : viewDidLoad
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- NSLog(@"here1");
- NSLog(@"%@",self.window);
- NSLog(@"%@",self.window.rootViewController);
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- NSLog(@"here2");
- [self.window setRootViewController:tableViewController];
- // or [self.window.rootViewController.view addSubview:tableViewController.view];
- NSLog(@"here3");
- return YES;
- }
- 2014-09-20 16:40:14.135 Refer[3260:60b] ViewController : initWithCoder:
- 2014-09-20 16:40:14.143 Refer[3260:60b] here1
- 2014-09-20 16:40:14.146 Refer[3260:60b] <UIWindow: 0x16e5f570; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e5fc10>; layer = <UIWindowLayer: 0x16e5f650>>
- 2014-09-20 16:40:14.148 Refer[3260:60b] <ViewController: 0x16da9be0>
- 2014-09-20 16:40:14.150 Refer[3260:60b] here2
- 2014-09-20 16:40:14.153 Refer[3260:60b] here3
- 2014-09-20 16:40:14.167 Refer[3260:60b] TableViewController : viewDidLoad
- 014-09-20 16:43:21.707 Refer[3268:60b] ViewController : initWithCoder:
- 2014-09-20 16:43:21.716 Refer[3268:60b] here1
- 2014-09-20 16:43:21.718 Refer[3268:60b] <UIWindow: 0x16d88720; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e7a1b0>; layer = <UIWindowLayer: 0x16d8c2b0>>
- 2014-09-20 16:43:21.720 Refer[3268:60b] <ViewController: 0x16d8a170>
- 2014-09-20 16:43:21.722 Refer[3268:60b] here2
- 2014-09-20 16:43:21.731 Refer[3268:60b] ViewController : viewDidLoad // <span style="color:#cc0000;">因为调用到了它</span>
- 2014-09-20 16:43:21.741 Refer[3268:60b] TableViewController : viewDidLoad
- 2014-09-20 16:43:21.743 Refer[3268:60b] here3