美文网首页
2018-05-06

2018-05-06

作者: Subterfuge | 来源:发表于2018-05-06 14:28 被阅读0次

    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方法

    相关文章

      网友评论

          本文标题:2018-05-06

          本文链接:https://www.haomeiwen.com/subject/ogayrftx.html