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

面试题引发的思考:

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底层原理 - 动态库、静态库)