前言
在iOS开发过程成,肯定会接触到库这个东西,比如系统的UIKit,第三方的SDWebImage等。所以库其实就是代码和文件的集合,通过这些可实现一些需要的功能。将这种代码快打包成二进制文件。并且可以载入到内存中。说白了就是将功能打包成一个模块,方便在开发过程中使用和共享。
静态库和动态库的区别
库的本质是可执行的二进制文件,根据使用的方式不同,可以分为动态库和静态库,其中系统提供的库都属于动态库。
静态库
- 是以.a 或者. FrameWork的后缀形式存在。
- 静态库的可执行文件通常会比较大,因为所需的数据都会被整合到目标代码中,因此编译后的执行文件不需要外部库的支持,直接就能使用。
- 静态库只需编译时加载,链接时,会完整的复制份到可执行文件中。
- 有多个app使用就会被复制多份,不能共享且占用更多冗余内存。
- 所有的函数都在库中,因此当修改函数时需要重新编译。
动态库
- 是以.tbd 或者. FrameWork的后缀形式存在。
- 动态库的文件会比较小,因为在编译过程中,数据并没有整合到目标代码中,只有在执行到该函数时才去调用库中的函数,但以此首次加载就比较耗时。
- 动态库由于没有整合到目标代码,因此编译时不会加载,运行时动态申请调用。
- 多个app使用,可以共享资源减少内存使用,但以此程序的运行环境需要提供相应的库。
- 库是动态的,因此修改库中函数时,不需要重新编译。
.FrameWork文件和其他两者的区别在于,项目中库的使用除了需要库文件之外,还包含资源文件和头文件。因此FrameWork其实已经和库文件没有关系,只是将库文件和所需的其他东西打包整合。
iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架 Cocoa Touch Framework。和系统 framework 不同,app 中使用 Cocoa Touch Framework 制作的动态库 在打包和提交 app 时会被放到 app main bundle 的根目录 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。