只是介绍重点过程
- 预编译器
- 符号化
- 宏定义的展开
-
import
的展开
- 编译器
- 语法和语义分析
- 将符号化后的内容转化为一棵解析树
- 解析树做语义分析
- 输出一棵抽象语法树
- 生成代码和优化
- 将
AST
转换为更低级的中间码 (LLVM字节码) - 对生成的中间码做优化
- 生成特定目标代码
- 输出汇编代码
- 将
- 语法和语义分析
- 汇编器
- 将汇编代码转换为机器代码。它会创建一个目标对象文件,一般简称为对象文件,文件以 .o 结尾
- 链接器
- 将多个目标对象文件合并为一个可执行文件 (.out)
- 运行
-
dyld
开始将可执行文件初始化 -
runtime
遍历所有加载进来的Class
,按继承层级依次调用Class
的+load
方法和其Category
的+load
方法;至此,可执行文件中和动态库所有的符号(Class,Protocol,Selector,IMP,…)
都已经按格式成功加载到内存中,被runtime
所管理,再这之后,runtime
的那些方法(动态添加 Class、swizzle 等等才能生效) -
dyld
调用main
函数 - 创建
UIApplication
- 创建
UIApplication
的delegate
对象 - 开启
runloop
- 程序启动完毕、调用代理的
application:didFinishLaunchingWithOptions:
- 在
application:didFinishLaunchingWithOptions:
里面创建window
- 设置
window
的根控制器 - 显示画面
-