2018-05-06

2018-05-06  本文已影响0人  Subterfuge

iOS启动原理

iOS启动 大致可分为t1(pre-main)main方法执行前 和 main之后,也就是didFinishLaunching方法之间(我称为t2);  totalLaunchTime = t1 + t2,也可以加上rootViewController里第一个tabbar viewDidLoad里的执行时间。 我们看看如何在这些 步骤里 尽量减少执行时间。

首先我们大概了解下app启动原理。点击app 时。dyld 代码执行有三步。

首先由dyld(即 dynamic link editor)动态链接器, 加载动态库,可执行文件(mach-O)加载入内存,生成对应的image(镜像文件),

随后进行link操作, 这里分三步, 1.递归加载依赖库进入内存, 2.递归rebase 修复地址, 因为ASLR 随机更改了 应用的地址分配, 需要rebase 修复地址 找到对应的代码地址执行。3.bind , 对库中所有的nolazy 符号进行bind.

最后 执行initializeMainExecutable. 调用所有的Image的Initializer 进行初始化。这里的Initializer是一个函数指针,指向 image初始化方法的地址;

这里执行第一个libsystem.dylib时, 会调用runtime初始化。 runtime 在这里 对类进行初始化,调用所有的load方法。 在去调用后面的initializer, 调用完所有的initializer后 ,dyld 会回调main地址 执行main方法

上一篇 下一篇

猜你喜欢

热点阅读