App启动过程之main函数之后的启动过程分析

关于这方面的文章,网上有很多了,但还是想从点滴积累,写下自己的理解,才能真正转化为属于自己的东西

从一个project来看应用启动过程,简单点可以以main函数为分水岭,分为main函数之前和main函数之后两个过程。之前看过唐巧的博客有很深入介绍main函数之前的启动过程分析。但我想先从简单的main函数之后的执行分析,关于main函数之前,app启动做了那些操作,计划下次掌握的更透彻了在来写文章记录下自己的分析和理解。

下面是大家都很熟悉的main.m文件,简单的几行代码,却包含了main函数开始,app启动执行的好几项操作呢~

#import 
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

很显然,main()函数只做了一件事,那就是调用UIApplicationMain()函数,接下来还是先了解下UIApplicationMain()函数吧~

/**
 * UIApplicationMain()函数剖析:
 *
 * 一、UIApplicationMain()函数负责:
 * 1、创建应用程序对象UIApplication
 * 2、创建应用程序代理AppDelegate
 * 3、开启事件循环Main RunLoop,delegate对象监听系统事件通知application对象
 *
 * 二、关于UIApplication​Main()的参数
 * 1、前两个参数是命令行参数。
 * 2、principalClassName: 该参数为 UIApplication 类名或其子类名的字符串,nil 是默认为 UIApplication。
 * 3、delegateClassName: 该参数为要初始化的应用程序代理(AppDelegate)类,也可指定为 nil,但需要从应用程序的主 nib 文件加载代理对象。
 *
 * 三、UIApplication​Main()函数返回值
 * 虽然该函数有返回值,但从不返回
 *
 **/
int UIApplicationMain(int argc, char * _Nonnull argv[], NSString *principalClassName, NSString *delegateClassName); 

至此UIApplicationMain方法执行完成,程序启动完毕,开始调用Application的delegate方法处理监听到的事件。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
}

- (void)applicationWillTerminate:(UIApplication *)application {
}

application:didFinishLaunchingWithOptions:方法内,会创建并设置应用的UIWindow和UIWindow的rootVC,并显示窗口。
接下来,就会根据读取的info.plist文件,看是否需要加载Main.storyboard文件设置UIWindow。

综上,main函数之后app启动的完整过程为:

1、执行main函数
2、执行UIApplicationMain函数 (执行和完成流程详见UIApplicationMain()函数剖析)
3、UIApplicationDelegate对象开始处理监听到的事件

你可能感兴趣的:(App启动过程之main函数之后的启动过程分析)