什么是库
库是程序代码的集合,共享程序代码的一种方式。库分为开源库
和闭源库
。开源库例如:MJExtesion
,SDWebImage
。项目中用到的微信支付 SDK,极光推送等就是以闭源库的形式展现。
存在形式
- 静态库:.a,.framework
- 动态库:.dylib,.framework
静态库特点
.a 文件 + .h 文件,看不到具体的实现代码。
静态库应用场景
- 保护自己的核心代码
- 将 MRC 的项目,打包成静态库,可以在 ARC 下直接使用不用转换
静态库和动态库区别
静态库在链接时,被完整地复制到可执行文件中,被多次使用,就有多份拷贝。
动态库则不会复制,只有一份,程序运行时加载到内存中,多个程序公用,节省内存。
项目中不允许使用自己的动态库。
静态库的生成和使用
新建项目,选择静态库项目。

简单创建一个 OC 类文件,写一个类方法。编译,生成静态库。

从文件中查看静态库。

光有 .a 文件还不够,需要暴露出头文件,让使用这个静态库的人知道如何。


静态库的架构
上面库的生成和使用,看起来都没问题,但是当把模拟器切换到 iphone 5 的时候,编译静态库就会报错。

因为不同的模拟器,真机设备,CPU 架构不一样,如果静态库不支持某个 CPU 架构的话,就不能成功编译。我们需要做的是:把静态库打包成预期使用环境的架构。
模拟器和真机的架构:
模拟器 | 架构 |
---|---|
iphone5 及之前的设备 | i386 |
5s-7plus | x86_64 |
真机 | 架构 |
---|---|
iphone5 及之前的设备 | armv7s(armv7 兼容 armv7s) |
5s-7plus | arm64 |
查看静态库架构
lipo -info 静态库路径

编译支持更多架构的静态库

选择要打包的对应的设备,这里选择的是真机。

这样打包出来的静态库,就支持多种架构。

同时兼容真机和模拟器
合并静态库
lipo -create 静态库A 静态库B -output hebing.a

选择 Release 还是 Debug
开发阶段选择 Debug,当正式发布静态库给别人用的时候,选择 Release。
创建 .framework
默认创建的是动态库,需要手动设置。头文件暴露,选择编译的版本,支持的架构等设置和创建 .a 文件一致。

静态库打包步骤
- 确定建立哪一种静态库
- 确定支持的架构
- 对外提供 release 版本
复合工程调试静态库
在 Demo 项目中创建静态库

通过静态库,解决 MRC 问题
创建静态库,配置项目不支持 ARC,打包成库,给其他项目使用
用 Swift 创建静态库
因为是跨模块,所以应该使用一些修饰符来创建类和方法。

编译之后,会生成一个桥接文件,把 Swift 相关的类和方法,写在 OC 头文件里,供其他地方使用。

网友评论