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