iOS应用程序启动原理
1、程序一启动就会调用main.m函数
2、调用UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName)
2.1. argc:执行main函数需要传入参数数组的个数
2.2. argv:执行main函数需要传入的参数数组
2.3. principalClassName:根据传入参数创建UIApplication对象,并设置UIApplicationMain对象的代理,需要传入 UIApplication及其子类的名字;若传入nil,默认传入UIApplication的类名
2.4.delegateClassName:根据传入参数创建对象,并设置为UIApplication代理对象, principalClassName传入UIApplication子类的类名,那么delegateClassName也必须传子类的类名
注:苹果官方文档对于UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName)描述
3.建立一个主的事件循环,包括应用程序的run loop
4.加载info.plist文件
4.1.如果info.plist文件中有Main Storyboard file base name,那么就去加载Main.storyboard,根据Main.storyboard的指向创建对应的控制器,在创建控制器之前,先去创建UIWindow并设置为主窗口(keywindow),将控制器设置为窗口的跟控制器(rootViewController),并将控制器的view添加到window上(self.window addSubview view),(view之所以能够显示就是因为有窗口-即UIWindow)调用AppDelegate代理方法
4.2.如果没有Main Storyboard file base name,那么就会调用AppDelegate代理方法
注:苹果给出图如下: