本文涉及的知识点:
- 动态库&静态库的基本概念
- 动态库&静态库的区别&加载方式
库
- 库是程序代码的集合,将多个文件组织起来。是共享程序代码的一种方式。
- 本质上:库是一段编译好的二进制代码,可以被载入内存中使用。使用库的时候需要对库的代码进行
Link
,而Link
有两种方式:静态和动态,从而产生了静态链接库和动态链接库的概念
动态库
- 以
.tbd
或者.framework
为文件后缀名(Xcode7 之前 是.dylib
) - 动态库在编译时不会被
copy
进目标文件中,而是在程序运行过程中要使用时,被dyld
加载进内存。(通过在目标文件中设置正确的rpath
来找到动态库并使用) - 系统的
Framework
是动态库,可以被其他应用共享,比如Foundation.framework/UIKit.framework
,自己创建的动态库,打包上传app store
时保留在沙盒中,所以是不支持共享的。不过,iOS8
上开放了App Extension
功能,可以为一个应用创建插件,这样主app
和插件之间共享动态库还是可行的。 -
dyld
加载动态库时,会检查framework
的签名,签名中必须包含TeamIdentifier
,并且framework
和 宿主app
的TeamIdentifier
必须一致。 -
App
中与动态库可以存在相同代码,不会产生冲突(对于动态库,编译器只会打个标机,并不会链接。链接会推迟到使用时,彼此保持独立)
优点:
- 不需要拷贝库代码到目标程序中,不会增大目标程序的体积
- 多个应用程序共享内存中得同一份库文件,节省资源(系统库,自定义的库可以与
App Extension
共享)- 整个应用程序分模块,团队合作
- 应用插件化
- 可以动态更新应用程序,模块实时升级
缺点:
- 载入时消耗性能;验证签名,载入内存都会大量消耗性能
- 动态更新库文件,上架
App store
会被拒绝- 配置繁琐,需要适配各个
cpu
架构
静态库
- 以
.a
或者.framework
为文件后缀。 -
.a
是一个纯二进制文件,.framework
中除了二进制文件外,还有资源文件 - 它的链接方式是在编译时就
copy
一份代码到目标文件中,这段代码就不会再变动。在build
过程中参与链接,合并到目标文件中 - 链接时:链接器只会将静态库中被使用的部分合并到可执行文件中去
优点:
- 模块化,分工合作
- 避免了大量的重复编译操作,提高编译速度
- 大大提高打包速度
- 代码的保密(像常用的
SDK
:比如高德、微信、Jpush
等都用的是静态包)- 提高代码的复用率
- 不需要外部的函数库支持
缺点:
- 目标文件过大
- 库文件抽取复杂,耗时耗力
- 库文件修改后,需重新编译使用
- 调试难度变大,无法断点
网友评论