一、静态库简介
1.1、库:是程序代码的集合,是共享程序代码的一种方式。
1.2、根据源代码的公开情况,库可以分为2种类型
<1>、开源库
公开源代码,能看到具体实现,比如我们常见的:AFNetworking、SDWebImage、MJRefresh 等等
<2>、闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
1.3、静态库和动态库的存在形式
-
静态库:.a 和 .framework
-
动态库:.dylib 和 .framework
1.4、静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(如下图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(如下图所示)
需要注意的是:项目中如果使用了自制的动态库,不能被上传到AppStore, 不允许上架!
1.5、 静态库应用场景?
-
保护自己的核心代码,比如国内的环信,百度地图,高德地图,友盟,个推,他们掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用,你只能看到他们的.h文件以及一些不重要的.m文件
-
将 MRC 的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
1.6、静态库的特点?
-
由 .a 和 .h 组成
-
看不到具体实现的代码
二、.a 静态库的制作
2.1、 创建项目时, 直接选择静态库(.a)
创建项目时, 直接选择静态库(`.a`)
2.2、定义一个类方法+(void)jk_test,在.h里面暴露出来jk_test
定义一个类方法`+(void)jk_test`
2.3、添加暴露的文件
添加暴露的文件
2.4、分别在真机与6s下编译,查看生成的.a与暴露文件
分别在真机与6s下编译,查看生成的.a与暴露文件
分别在真机与6s下编译,查看生成的.a与暴露文件
2.5、新建一个工程测试 上面我们创建的 .a 文件 与 暴露文件 是否可以使用
新建一个工程测试 上面我们创建的 `.a` 文件 与 暴露文件 是否可以使用
测试结果:
1、使用6S模拟器进行测试, 可以使用
2、使用低型号模拟器测试,; 失败
3、使用真机, 编译; 失败
分析原因:原因是静态库分架构,不同的CPU架构是不一样的 ,如果 .a静态库 不支持架构,运行会报错
静态库所支持的架构
模拟器: 4s~5 : i386;5s ~ XS Max: x86_64
真机: 3gs~4s : armv7;5/5c : armv7s(armv7兼容armv7s);5s~XS Max: arm64: arm6