【面试题】程序在启动之前都做了什么?

当我们在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值