概念认识
什么是库
- 库是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成库,只暴露出头文件以供使用。
- 库分为静态库和动态库两种。
- 静态库:链接时完整地拷贝至可执行文件中,使可执行文件体积变大。如果多个APP都使用了同一个静态库,那么每个APP都会拷贝一份。
- 动态库:链接时不拷贝至可执行文件中,可执行文件只会存储指向动态库的引用。程序运行时由系统动态加载到内存中,系统只会加载一次, 多个APP共用一份。
- 静态库的存在形式有两种:.a静态库、.framework静态库
- 动态库的存在形式有两种:.dylib动态库、系统的.framework动态库
系统的.framework是系统SDK库,有Foundation.framework、UIKit.framework、MapKit.framework等。由于苹果不开源,每个框架只提供了接口(.h文件),所有实现(.m文件或.c/.cpp文件)编译在一个.framework二进制文件中。
苹果把所有系统的.framework二进制文件统一打包到一个共享缓存文件中(dyld shared cache),共享缓存文件存储在手机路径(需要越狱才能找到):/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX。X代表ARM处理器指令集架构。
动态链接器(dyld)存储在手机路径:/usr/lib/dyld,用于在APP运行时,链接APP和系统的.framework。
![](https://i-blog.csdnimg.cn/blog_migrate/d2f3ddc4775e23263001d8025accf655.png)
两种.framework区别
- 静态库的形式包含.a和.framework两种形式,动态库的形式包含.dylib和系统的.framework两种形式。
动态库的.framework是系统SDK才有的库,而我们自己创建出来的.framework都是静态库
静态库中.a与.framework的区别
- .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,需要.h文件配合。
.framework文件可以直接使用,因为本身包含了.h文件和资源文件。
.framework = .a + .h + sorrceFile(资源文件)
静态库的优点
- 实现程序的模块化,将固定的业务模块化成静态库。
- 方便共享代码,即可以和别人分享你的代码库,但别人又看不到你代码的实现。
- 开发第三方sdk的需要,例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口