iOS中的静态库和动态库
静态库
- 静态库完全复制进可执行的二进制里面
- 后缀是
.a
或者.framework
动态库
- 动态库是在程序冷启动时候被链接到手机内存或者 App 内存里面
- 后缀是
.tbd
或者.framework
关于说明很多,可以看一下网上的文章。我现在说的是基于上面理论的证明。刚开始觉得网上说的可能不太准确,后来得到验证是正确的。
为了研究我们创建的.a
和.framework
到底是静态库和动态库,我们分别创建对应的简单的库。
我们分别可以通过上面图中红色区域创建.framework
和.a
。我们知道区分是静态库还是动态库最终是我们选择的 Mach-O
的类型到底是Dynamic Library
还是Static Library
。
Mach-O 类型
这里简单说一下Mach-O
类型,为什么说简单说一下。因为深入我也不了解了,深入可以谷歌资料。
-
Executable:应用的主要二进制
-
Dylib Library:动态链接库(又称DSO或DLL)
-
Static Library:静态链接库
-
Bundle:不能被链接的Dylib,只能在运行时使用dlopen( )加载,可当做macOS的插件
-
Relocatable Object File:可重定向文件类型
静态库和动态库的对比
为了让打出来的库更加的真实,我们使用网上出名的库作为测试。我们选取的是FLEX作为测试的目标,因为这个库所包含的文件多,数据真实性更加的可靠。我们编译的环境是基于iPhone 6s Plus
进行编译出来的,真正的大小会包含其他框架会比我测试大得多。
二进制大小
二进制大小(iPhone 6s Plus) | .a | .framework |
---|---|---|
静态库 | 6.8MB | 4.6MB |
动态库 | 1.6MB | 1. |