小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
前文描述了什么动态库和静态库,接下来我们要了解的是静态库和动态库的体积大小,这也是我们最关心的问题。
静态库和动态库的体积区别
| 体积大小 | 静态库 | 动态库 |
|---|---|---|
| 相同代码打出来的体积(自身体积) | 同样的代码生成静态库文件体积大(.o文件的合集)= header + .o + 签名 + 资源文件 | 同样的代码生成动态库文件体积小,类似只有一个.o文件=header+.dylb+.a+签名 |
| 相同代码的库对APP的体积 | 可能比动态库小,因为使用静态库链接的时候,会通过一些参数来copy用到的代码,并不会把所有的代码都copy。在链接的时候,静态库文件和目标文件打包在一起的时候,macho内部也会用到内存对齐的规则。(-objc,-all_load ,-force_load等)链接器ld链接静态库的时候,默认只会链接用到的代码。-all_load ,-force_load 会copy所有的代码 | 我们自己做出来的动态Framework 最后也还是要拷贝到 App 中。 |
手动创建的动态库和系统的动态库
| 自己创建的动态库 | 系统的动态库 | |
|---|---|---|
| 位置 | 放在app bundle中,运行在沙盒中 | 系统目录下 |
| 共享 | APP和APP Extension(iOS8)之间共享,iOS是运行在沙盒中的,不同程序之间不能共享代码 | 多个程序之间共享 |
| 动态性 | 部分动态性受到 iOS 平台限制(签名机制和沙盒机制限制)的动态库 | 完全的动态性 |
| 大小 | (使用Embedded)内嵌一份到APP中 | 编译的时候不会被copy到目标程序中,目标程序只会存储指向动态库的引用。 |