美文网首页
iOS底层原理 - 动态库、静态库

iOS底层原理 - 动态库、静态库

作者: hazydream | 来源:发表于2020-06-26 11:00 被阅读0次

    面试题引发的思考:

    Q1:什么是库(Library) ?

    • :是 资源文件代码编译 的一个集合。
    • 编译 可以理解为将 源代码 编译为 目标文件
    • 链接 可以理解为将 各种目标文件 上加一些 第三方库、并且和 系统库 链接起来为 可执行文件
    • 静态库:在 编译时,完整的拷贝至 可执行文件 中,被多次使用就有多次冗余拷贝;
    • 动态库运行时 由系统 动态加载 到内存,而不是复制,供程序调用。系统只加载一次,多个程序共用,节省内存。

    Q2:静态库和静态库的区别?

    静态库

    • .a.framework 后缀结尾;
    • 编译时 会被直接 拷贝一份,复制到 目标程序 中;
    • 目标程序没有 外部依赖
    • 目标程序的 体积增大

    动态库

    • .dylib.framework 后缀结尾;
    • 运行时 由系统 动态加载 到内存中;
    • 共享库,不会影响目标程序的体积;
    • 我们随时对库进行替换,而不需要重新编译代码;
    • 动态库在制作的时候可以直接包含静态库,也能自动link所需要的依赖库。
    图例

    Q3:framework为什么既是静态库又是动态库?

    • framework 实际上是一种 打包方式,将库的 二进制文件头文件 和有关的 资源文件 打包到一起,方便管理和分发。
    • 它既可以是动态库也可以是静态库。
    • 系统的 .framework 是动态库;
    • 我们自己建立的 .framework 是静态库 or 有限制的动态库。

    Q4:.a 与 .framework有什么区别?

    • .a 是一个纯 二进制文件
      .framework中除了有二进制文件之外还有 资源文件
    • .a 文件不能直接使用,至少要有.h文件配合;
      .framework文件可以直接使用。
    • .a + .h + sourceFile = .framework。

    Q5:swift使用动态库?

    • Swift项目引用外部的代码方式:
    • 法一:是把代码 拷贝到工程 中;
    • 法二:用 动态framework
    • 不支持使用静态库
      因为 Swift 的 运行库 没有被包含在 iOS系统 中,而是会打包进 App中(这也是造成 Swift App 体积大的原因)
      静态库会导致最终的目标程序中包含重复的运行库

    Q6:swift使用静态库?

    • 可以创建 静态库;
    • 不可以使用 静态库。

    Q7:CocoaPods中静态库和动态库?

    • 默认使用 静态库,即 #use_frameworks!
    • 添加 use_frameworks! 表明Pod使用 动态库 , Pods/Products里都是动态库(.framework文件);
    • 不添加 use_frameworks! 表明Pod使用 静态库, Pods/Products里都是静态库(.a文件)。

    Q8:可以在runtime时加载动态库吗?

    • 不可以。苹果不允许在审核后更改app的行为,类似于热修复

    Q9:在使用静态库时,某些Pod不支持module怎么办?

    • 法一:使用use_modular_headers! 来让所有Pod 支持静态库;
    • 法二:对不支持静态库的Pod后面添加 :modular_headers => true 来使其 支持module

    相关文章

      网友评论

          本文标题:iOS底层原理 - 动态库、静态库

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