1、什么是库
首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。
什么时候我们会用到库呢?
- 一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。 (一些引入的第三方库)
- 对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。 (一些比较稳定的工具类,或者很稳定的功能模块)
2、概念介绍
动态库,静态库,framework 其实不是一个维度上。
1、framework
framework并不是库,它只是一种打包方式,它既可以是动态库也可以是静态库。将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发,和静态库动态库的本质是没有什么关系。
2、静态库
静态库 (静态链接库) 以.a 和 .framework 结尾 。 只所以叫静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在程序里就不会在改变
优点:编译完成之后,库文件没有作用了,目标没有外部依赖,直接可以运行
缺点: 会是目标体积增大
3、动态库
动态库(动态链接库) 以 .dylib 或者 .framework 后缀结尾 与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
优点:不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,运行时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。
缺点: 动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux 下喜闻乐见的 lib not found 错误)。
3 ios 常见的几种库
系统动态库 Dynamic Framework
系统提供的 framework 都是动态库,比如 UIKit.framework,具有所有动态库的特性。
用户动态库 Embedded Framework
用户可以制作的“动态库”,它是受到 iOS 平台限制(签名机制和沙盒机制限制)的动态库,它具有部分动态特性,比如:
- Embedded Framework 可以在 Extension可执行文件 和 APP可执行文件 之间共享,但是不能像系统的动态库一样,在不同的 APP(进程) 中共享
- 系统的 Framework 不需要拷贝到目标程序中,Embedded Framework 最后也还是要拷贝到 APP 中.
静态库 tatic Framework
Static Framework,静态库,用户可以制作,可以粗略的理解为,它等价于 头文件 + 资源文件 + 二进制代码,它具有静态库的属性。
静态库就是我们组件化中常见的工具库