静态库和动态库都是以二进制提供代码复用的代码库。
两者的区别
- 静态库:链接时会被完整的复制到可执行文件中,所以如果两个程序都用了某个静态库,那么每个二进制可执行文件里面其实都含有这份静态库的代码。
- 动态库:链接时不复制,在程序启动后用动态加载,然后再决议符号,所以理论上动态库只用存在一份,好多个程序都可以动态链接到这动态库上面,达到了节省内存(不是磁盘是内存中只有一份动态库),由于动态库并不绑定到可执行程序上,所以我们想升级这个动态库就很容易,windows和linux上面一般插件和模块机制都是这样实现的。
库类型 | 优点 | 缺点 |
---|---|---|
静态库 | 1. 目标程序没有外部依赖,直接就可以运行。2. 效率教动态库高。 | 1. 会使用目标程序的体积增大。 |
动态库 | 1. 不需要拷贝到目标程序中,不会影响目标程序的体积。2.同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。3.运行时时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码,实现动态更新。 | 1.动态载入会带来一部分性能损失(可以忽略)2.动态库也会使得程序依赖外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux lib not found 错误)。 |
iOS里面静态库/动态库的形式
- 静态库常见的是.a .framework
- 动态库常见的是 .dylib/.tbd .framework
framework为什么既是静态库又是动态库?
系统的.framework是动态库,我们自己建立的.framework是静态库。
特别注意的是平时我们经常说的Framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。
也就是说我们的Framework其实是资源打包的方式,和静态库动态库的本质没有什么关系。
.a 和 .framework有什么区别?
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
建议用.framework.
为什么使用静态库?
- 方便共享代码
- 实现iOS程序的模块化,可以把固定的业务模块化成静态库
- 和别人分享你的代码库,但不想让别人看到你代码的实现
- 开发第三方SDK时需要
注意:
- 无论是.a静态库还是.framework静态库,我们需要的都是二进制文件 + .h + 其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framwork本身已经包含了.h和其它文件,可以直接使用
- 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,改名为.bundle就可以了,右键显示包内容可以向其中添加图片资源
- category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时,有时会找不到该方法的运行时错误,解决办法是:在使用静态库的工程中配置other link flags的值为 -Objc
- 如果一个静态库很复杂,需要暴露的.h比较多,就可以在静态库的内部创建一个.h文件,然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,然后暴露出来。
网友评论