一、静态库简介
1、什么是库
- 库:是一种程序代码的集合,是共享程序代码的一种方式
2、库的分类
-
开源库
- 公开源代码,能看到具体实现
- 比如AFNetworking
-
闭源库
- 不公开源代码,是经过编译后的二进制文件,看不到具体实现,只会暴露接口使用。商业级的代码一般都是以这种形式提供使用
- 主要分为:静态库 和 动态库
-
静态库的存在形式
- .a文件类型的静态库
- .framework文件类型的静态库
-
动态库的存在形式
- .dylib 或 .tbd文件形式存在
- .framework形式存在
3、静态库和动态库的区别
-
静态库
- 静态库在链接时,会被完整的复制到可执行文件中,被多次使用,就会有多分拷贝。
-
动态库
- 动态库则不会被复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序公用,节省内存。
- !!!但是,项目中如果使用到自己的动态库,是不允许上架的。
- 系统使用的库就是动态库(UIKit)
4、静态库使用场景
- 为了保护自己的核心代码
- 商业级SDK,保护核心技术,同时又希望更多的程序员来使用其技术,因此采用“闭源”的方式(如:支付宝、微信、友盟)
- 将MRC的项目,打包成静态库,可以在ARC下直接使用,不需要配置
- 提高工程的编译速度
5、静态库使用形式
- .a文件+.h文件,看不到具体实现的代码
二、静态库制作
1、创建静态库


2、编写代码
#import "RevanStaticLib.h"
@implementation RevanStaticLib
+ (void)revan_Log {
NSLog(@"来自静态库的 Log");
}
@end
3、编译产生.a静态库文件


4、静态库所支持的架构
- 1、查看静态库的架构
- 进入当前静态库所在目录在终端执行
lipo -info 静态库名称.a
比如:
lipo -info libRevanStaticLib.a

-
所以,当前静态库可以在x86_64架构上使用
-
2、当把模拟器换成iPhone5时,发现打出的静态库是i386架构的
模拟器iPhone5生成的静态库.png
-
当在一个项目中使用这个静态库时,发现选择模拟器为iPhone8,项目会报错,因为当前的RevanStaticLib是一个 i386 架构的静态库,而iPhone8使用的是x86_64架构的系统,所以是不支持iPhone8的
在模拟器iPhone8上使用i386架构的静态库.png
-
3、所以我们在制作静态库的时候,要想这个静态库在所有的模拟器上使用必须要支持所有的架构
支持所有架构的静态库设置.png
支持所有模拟器架构的静态库.png
-
4、此时的静态库已经可以在所有的模拟器上使用,但是在我们使用真机运行时
真机上无法运行模拟器生成的静态库.png
-
5、制作真机静态库
生成可以在真机上运行的静态库.png
-
6、此时静态库可以在真机上使用,但是当切换成模拟器时发现又会报错,因为此时的静态库中不包含模拟器所需的i386、x86_64架构,在使用时,当使用真机时,导入真机所需的静态库;当使用模拟器时,可以导入模拟器所需的静态库;这样显得有一点麻烦,需要来回的切换。还有一个方式是把这2个静态库合并成一个静态库
lipo -create 真机静态库路径 模拟器静态库路径 -output 合并后静态库名称

-
这样做虽然比较简单方便,但是会使静态库变大,差不多是真机静态库和模拟器静态库大小之和,具体采用哪种方式根据个人需求而定
-
7、经过以上步骤所制作出来的静态库都是Debug环境下的,只需少改配置,就可以制作release环境下的静态库
制作release静态库.png
三、小结:不同机型的CPU,对应的架构不同
-
模拟器
- 4s - 5:i386
- 5s - iPhone X:x86_64
-
真机
- 3gs - 4s:armv7
- 5 / 5c:armv7s (armv7兼容armv7s)
- 5s - iPhone X:arm64
网友评论