面试题引发的思考:
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。
网友评论