加载顺序_iOS:动态库的加载顺序

在写  《iOS:load方法能不能被hook?》 和  《iOS启动优化:App启动耗时在线监控与AppDelegate管控》 两篇文章时都提到了动态库的加载,由于主题的原因,没有详细介绍,有同学对这个比较感兴趣,今天我们就来研究下在iOS中动态库的加载顺序是什么样子的。

1.实验篇

我们先通过demo看下几种Case:

  • 没有依赖关系:

    900761f4839e9ad3c206970e2a0a86b9.png


    我们制作dylibAdylibBdylibB这三个动态库(不了解动态库的制作的请问度娘...),且它们没有依赖关系,同时我们在每个库中添加一个Class,暂且以Class的load方法的调用顺序当做是动态库的加载顺序(先挖一个坑),比如dylibA

    @implementation ClassA
    + (void)load {
        NSLog(@"dylibA loaded");
    }
    @end

    将这三个库加到demo工程中,并且保证Build Phases-Link Binary With Libraries中的顺序:dylibA > dylibB > dylibC,运行结果:

    Demo[53199:17384949] dylibA loaded
    Demo[53199:17384949] dylibB loaded
    Demo[53199:17384949] dylibC loaded

    我们调整下Link Binary With Libraries中的顺序:dylibC > dylibB > dylibA,运行结果:

    Demo[53265:17397552] dylibC loaded
    Demo[53265:17397552] dylibB loaded
    Demo[53265:17397552] dylibA loaded

    通过实验我们知道:在没有依赖关系的情况下,动态库的加载顺序由Link Binary With Libraries中的顺序决定,当然我们可以通过Link Binary With Libraries来控制动态库的加载顺序。

  • 单一依赖关系

    299c42944f98408e028f61c79444a32a.png

    dylibA依赖dylibBdylibB依赖dylibC,我们简单改造下这三个库,如在dylibB中import下dylibC的头文件,dylibA中同理:

    #import "ClassB.h"
    #import >dylibC/dylibC.h<

    @implementation ClassB
    + (void)load {
        NSLog(@"dylibB loaded");
    }
    @end

    Link Binary With Libraries中的顺序:dylibA > dylibB > dylibC,运行结果:

    Demo[53570:17450857] dylibC loaded
    Demo[53570:17450857] dylibB loaded
    Demo[53570:17450857] dylibA loaded

    这次我们发现三个库的加载顺序是反的,我们修改下顺序:dylibC > dylibA > dylibB,运行结果不变。由实验结果可知:动态库的加载顺序还受依赖关系影响,被依赖的子节点优先加载。

  • 组合依赖关系

    2e8913e18ced0c77f4ed95aa839eccd8.png

    其中,dylibAdylibBdylibB 没有依赖关系,dylibA 依赖了dylibDdylibEdylibF

    Demo[97898:19286936] dylibD loaded
    Demo[97898:19286936] dylibF loaded
    Demo[97898:19286936] dylibE loaded
    Demo[97898:19286936] dylibA loaded
    Demo[97898:19286936] dylibB loaded
    Demo[97898:19286936] dylibC loaded

    通过修改dylibA-Link Binary With LibrariesdylibDdylibE的顺序调整为:

    ea29f2132288aa36a0a0e46d7ea80952.png

    Demo[97982:19305235] dylibF loaded
    Demo[97982:19305235] dylibE loaded
    Demo[97982:19305235] dylibD loaded
    Demo[97982:19305235] dylibA loaded
    Demo[97982:19305235] dylibB loaded
    Demo[97982:19305235] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值