首页 > 代码库 > iOS核心笔记——iOS应用程序启动原理

iOS核心笔记——iOS应用程序启动原理

1、iOS应用程序启动示例图:

技术分享


2、应用程序启动原理:

2-1、不通过storyboard文件启动:
  1. 执行main函数;
  2. 执行main函数中的UIApplicationMain函数,创建UIApplication对象,创建ApplicationDelegate对象并将其设置为UIApplication对象的代理;
  3. 程序启动完毕,开启消息循环(Main RunLoop)、监听事件并调用注册方法;接着调用代理的application:didFinishLaunchingWithOptions:方法;在该方法中手动创建UIWindow对象设置为代理的window属性;
  4. 创建控制器,将控制器设置为window的根控制器(rootViewController),此时,控制器中的View会自动加载到window上;
  5. 将创建好的window设置为主窗口并显示(调用window的makeKeyAndVisible方法)。

示例程序

1./**
2. 应用程序启动完毕
3. */
4.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
5. // 1. 创建窗口
6. UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
7. self.window = window;
8.
9. // 2. 创建窗口的根控制器
10. UIViewController *vc = [[UIViewController alloc] init];
11. vc.view.backgroundColor = [UIColor redColor];
12. self.window.rootViewController = vc;
13.
14. // 3. 成为主窗口并显示
15. [self.window makeKeyAndVisible];
16.
17. return YES;
18.}

2-2、通过storyboard文件启动:
官方文档解释说明:

技术分享

  1. 执行main函数;
  2. 执行main函数中的UIApplicationMain函数,创建UIApplication对象,创建ApplicationDelegate对象并将其设置为UIApplication对象的代理;
  3. 自动创建好UIWindow对象;
  4. 检索info.plist文件中最重要的storyboard(通常为Main storyboard)信息,根据info.plist提供的信息,加载storyboard文件,自动创建好控制器和控制器的View;
  5. 将创建好的控制器设置为window对象的根控制器(rootViewController)并显示窗口。
  6. 应用程序启动后,会开启应用程序的Main Runloop(事件循环),监听事件并调用注册的方法(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法);

3、UIApplicationMain()函数:

官方文档解释说明:技术分享

3-1、UIApplicationMain()参数使用说明:
  1. argc:使用main函数中的argc即可;
  2. argv:使用main函数的argv即可;
  3. principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类),如果为nil,则用UIApplication类作为默认值;

    备注:传入应用程序对象类名,nil == NSStringFromClass([UIApplication class]) == @"UIApplication"

     

  4. delegateClassName:指定应用程序的代理类,UIApplicationDelegate协议中定义的方法,在该类中实现。

3-2、UIApplicationMain()功能:

 

  1. 根据principalClassName创建UIApplication对象;
  2. 根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性;
  3. UIApplicationMain()函数开启一个“死循环”(事件循环), 所以程序不会退出, 我们可以任意使用。在这个“死循环”(事件循环)中程序不断监听用户的各种事件, 依次处理(依靠”事件队列”实现)。

 

备注:在消息循环中不断监测消息队列中是否有新的事件(队列是先进先出,事件队列的目的是为了提高性能),消息循环可以简单理解为一个死循环;当系统有事件被触发,事件所执行的方法会放入消息队列中,消息循环的作用就是不停的去消息 队列中看有没有新的消息,有就执行,用户感觉不到等待的时间。


3-3、UIApplicationMain()函数退出:

备注:程序正常退出时UIApplicationMain函数才返回。


4、程序启动四大对象关系示例图:

技术分享

iOS核心笔记——iOS应用程序启动原理