库是共享程序代码的方式。库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成库,只暴露出头文件以供使用。库分静态库和动态库两种。
库的分类
- 开源库
源代码是公开的,你可以看到具体实现。比如GitHub上比较出名的第三方框架AFNetworking、SDWebImage。 - 闭源库
不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库和动态库。本篇重点要讲的便是其中的静态库。
静态库和动态库
存在形式:
- 静态库
以".a"或者“.framework”为文件后缀名 - 动态库
以".dylib"或者“.framework”为文件后缀名
使用区别:
- 静态库链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
- 动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。
iOS设备CPU架构
这里只考虑iPhone 5S以后的机型
- 模拟器:x86_64
- 真机:arm64
打包静态库(这一篇我们只讲.a静态库)
1、打开Xcode创建一个新的工程,这里以Xcode9为例,选择工程如下:
image.png2、创建工程完毕后,添加一个方法用于测试
image.png image.png3、设置适配所有模拟器架构
image.png
4、编译工程进行打包
image.png打包时如果选择模拟器打包,该包就只能在模拟器上使用,选择真机打包,该包就只能在真机上使用
运行完毕后,我们会看到工程中Products文件夹下的libStaticLibrary.a文件由红色变成了黑色。右键show in finder可以在其目录下找到它。这就是我们打包好的.a静态文件了。
5、公开接口头文件
image.png6、解决模拟器和真机的静态包不能混用的问题
image.png打包命令:
lipo -create 完整路径(1)/lib.a 完整路径(2)/lib.a -output 输出路径/lib.a“完整路径(1)/lib.a”是模拟器静态包的路径
“完整路径(2)/lib.a”是真机静态包的路径
"输出路径/lib.a"是自己指定的输出路径
输出的文件名最好和原有静态包名一致
使用静态库
1、把打包好的静态库拿出来
image.png image.png2、静态库在其他工程中的使用
image.png3、替换.a文件
image.png上面一步中我们自己生成了一个模拟器和真机混用的静态包,拿这个.a文件替换掉项目中的.a文件就行了
4、调用静态库中的方法(真机模拟器都可用用这个静态库了)
image.png
网友评论