程序启动的过程总结
1.main函数
2.UIApplicationMain
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
- 此函数会根据
principalClassName创建UIApplication对象 - 此函数会根据
delegateClassName创建一个delegate对象 - 并将该
delegate对象赋值给UIApplication对象中的delegate属性
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
-
principalClassName传nil,默认是UIApplication,创建一个UIApplication对象 -
delegateClassName不能传nil,这里传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载,因为视图都是懒加载的,因此就不会创建窗口,什么东西都没有。 -
argc,argv: ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
3.delegate对象开始监听(处理)系统事件(没有storyboard),手动执行
- 程序启动完毕的时候,就会调用代理的
application:didFinishLaunchingWithOptions:方法 - 在
application:didFinishLaunchingWithOptions:中创建UIWindow - 创建和设置UIWindow的rootViewController
- 显示窗口
4.delegate对象开始监听(处理)系统事件(有storyboard),系统自动执行
- 根据
info.plist文件获得最主要的storyboard的文件名,加载最主要的storyboard - 创建UIWindow
- 创建和设置UIWindow的rootViewController
- 显示窗口

mian.storyboard的加载过程.png
- 内部实现原理(
由系统自动完成):

main.storyboard内部实现原理.png