在 iOS 开发中,我们经常看到.framewrok 文件,那么这个文件到底是怎么来的,有什么作用?
什么是“库”?
首先引入“库”的概念。这可不是“库克”的“库”,“库”就是程序代码的集合,将n个文件组织起来,是共享程序代码的一种方式。库分为开源库和毕源库。
开源库
源代码是公开的,可以看到每个实现文件(.m文件)的实现,例如GitHub上的常用的开源库:AFNetworking、SDWebImage等;
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体的实现。闭源库又分为:静态库 和 动态库
静态库
你看到的.a 文件就是静态库。
应用场景:保护自己的核心代码,如讯飞语言摸索了好多年探索出的结果当然要保护起来了,都公开了公司还怎么生存。
将MRC的项目打包成静态库,可以在ARC下直接使用,不用转换。如别人使用MRC写的开源库,放到自己ARC项目中,需要对每个文件加一个编译参数 -fno-objc-arc,这样相对来说麻烦,将整个工程打包成静态库直接放到项目中即可,也不用对每个文件添加编译选项。
动态库
你看到的.dylib和.tbd 文件就是动态库。
综上,.framework 可能是静态库,也可能是动态库。
.a文件肯定是静态库,.dylib肯定是动态库,.framework可能是静态库也可能是动态库;
静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
但是项目中如果使用了自己定义的动态库,苹果是不允许上架的,在iOS8.0以后苹果开放了动态加载.dylib的接口,用于挂载.dylib动态库。
制作静态库
1.新建一个 project。名字就取我们常用的 FMDB 吧,如图
2.写个方法进去
3.指定静态库需要公开的头文件 (如果已经有如图所示的头文件,此步骤可忽略)
4.编译 command + B
5.点击对应的.a文件,show in Finder。即可看到生成以个.a 文件,可以将该文件拖入其他工程中进行使用验证。