库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
如SDWebImage, AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为: 静态库,动态库
静态库
.a
.framework
动态库
.dylib
在Xcode 8里面,看到后缀为.tbd的库,它的本质都是.dylib文件
.framework
静态库
链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025152338303.png)
动态库
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025152326674.png)
链接时不复制,程序运行时由系统动态的加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
模拟器:
4s-5: i386
5s-7 Plus: x86_64
真机(iOS设备):
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
arm64: iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
1.new -> project 选择Static Library
2输入静态包名称,选择语言,这里我使用oc讲解
3.设置支持的系统版本
StaticLib.h
#import
@interface StaticLib : NSObject
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
@end
StaticLib.m
#import "StaticLib.h"
@implementation StaticLib
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
{
return num1 + num2;
}
@end
5.选择一台模拟器(默认只支持的这里选择的模拟器架构),Common + B 编译一下,编译通过会是黑色字体的libStaticLib.a文件(编译不通过字体红色的),
6.右键Show in Finder 查看
7.终端查看静态库所支持的架构
终端->cd进入库文件路径->lipo -info 库名
8.设置适配所有模拟器架构
选择一台模拟器,然后
project -> buildSeting -> Build Active Architecture Only 设为NO
9.再次查看支持的cpu架构
10.设置适配所有真机的架构
这里选择Generic Ios Device 或者连接一台真机
project -> buildSeting -> Build Active Architecture Only 设为NO
Common+B 编译
11.show in finder ,多出一个真机的静态库
12.合并两个静态库
终端命令: lipo -create 静态库1名 静态库2名 -output 新静态库名称
lipo -create Debug-iphoneos/libStaticLib.a Debug-iphonesimulator/libStaticLib.a -output libStaticLib.a
新建一个IOS应用,创建一个libs文件夹,把.a库,和头文件拖进来,运行
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"和:%ld", (long)[StaticLib sumNum1:12 num2:14]);
}
https://wwwcnblogs.com/mtystar/p/6082363.html
https://www.jianshu.com/p/13bf46df9387
https://www.jianshu.com/p/5eea9a56d249
https://www.jianshu.com/p/bc00e1a06489
https://www.jianshu.com/p/826c9af4323c