什么是库?
库(Library)说白了就是一段编译好的
二进制代码,加上头文件就可以供别人使用。
什么时候我们会用到库呢?
一种情况是
,某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是
,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要Link
一下,不会浪费编译时间。
iOS 中的链接(Linking)
是为了链接你的应用中会用到的库。在实际开发过程中,一个库一般都包括了可执行代码,公共的头文件和资源
,这些库可以被链接器连接到你的应用。
上面提到库在使用的时候需要Link
,Link 的方式有两种,静态和动态
,于是便产生了静态库和动态库
。
- 动态库形式:.dylib和.framework
- 静态库形式:.a和.framework
- 动态库和静态库的区别
静态库
:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
link 静态库
link 动态库
静态库
在编译时加载,链接时会完整的复制到可执行文件中。静态库
的可执行文件通常会比较大,因为所需的数据都会被整合到目标代码中,因此编译后的执行文件不需要外部库的支持,直接就能使用。- 有多个app使用就会被
复制
多份,不能共享且占用更多冗余内存。- 所有的函数都在库中,因此当修改函数时需要
重新编译
。
注释:.a 和 .framework 的区别,推荐生成使用.framework。
.a
是单纯的二进制文件,.framework
是二进制文件+资源文件。- 其中
.a
不能直接使用,需要 .h文件配合,而.framework
则可以直接使用。 - .framework = .a + .h + sourceFile(资源文件)
系统动态库
:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
动态库的作用
应用插件化:
每一个功能点都是一个动态库,在用户想使用某个功能的时候让其从网络下载,然后手动加载动态库,实现功能的的插件化
关于Framework
- framework为什么既是静态库又是动态库?
系统的.framework是动态库,我们自己建立的.framework一般都是静态库。但是现在你用xcode创建Framework的时候默认是动态库,一般打包成SDK给别人用的话都使用的是静态库,可以修改
Build Settings
的Mach-O Type
为Static Library
。
- 什么是framework
Framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。一般如果是静态Framework的话,资源打包进Framework是读取不了的。静态Framework和.a文件都是编译进可执行文件里面的。只有动态Framework能在.app下面的Framework文件夹下看到,并读取.framework里的资源文件。
Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。
平时我们用的第三方SDK的framework都是静态库,真正的动态库是上不了AppStore的(iOS8之后能上AppStore,因为有个App Extension,需要动态库支持)。