当我们在Xcode编写完成Code,comand+R,稍等一会,模拟器出现了页面,一次成功的App启动。
这个过程中,都做了什么呢?
第一阶段:预处理(Preprocessing),编译器(Compiler),汇编器(Assembler),生成Mach-O文件
第二阶段:读取Mach-O文件,加载dylb(Linker),初始化Runtime(Loader)
第三阶段:调用main函数
第四阶段:首屏渲染
第一阶段分析:(main函数前1)
预处理
他会处理程序中的宏定义,依赖关系,和预处理器指令。
编译器
Xcode使用LLVM编译器,其前端使用的是Clang,他对语意和语法分析,语法树分析,生成中间代码;创建并管理符号表;到此前端工作结束。
汇编器
后端在对中间代码进行优化,针对不同架构,生成不用的汇编代码,最后LLVM将这些汇编代码输出生成二进制可执行文件(Mach-O)。
第二阶段分析:(main函数前2)
加载器
系统读取Mach-O文件,获取dyld路径,加载dyld,dyld初始化运行环境,开启缓存策略,加载程序相关的依赖库并进行链接,最后调用每个依赖库的初始化方法。
同时Runtime被初始化,当所有依赖库初始化结束,进行Mach-O文件初始化,这时Runtime会对项目中所有类进行类结构初始化,调用所有类的+load方法。
最后dyld返回main函数地址,调用main函数。
第三阶段分析:(main函数)
main函数会调用UIApplicationMain函数
UIApplicationMain内部执行:创建UIApplication对象->创建UIApplication的delegate对象->开启主线程的runloop->didFinishLaunchingWithOptions方法
第四阶段分析:(main函数后)
在didFinishLaunchingWithOptions中创建window