iOS静态库的创建跟使用

来源:互联网 发布:开眼软件 编辑:程序博客网 时间:2024/06/13 01:05

库:是代码的集合,是共享代码的一种形式,库分为开源库跟闭源库。

开源库
公开源代码,能看到具体实现过程。
如:AFNetworking,SDWebImage
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现。
分为静态库跟动态库

iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework形式存在。
苹果禁止用户在项目中自己创建使用动态库,如果用户在项目中使用自己创建的动态库,发布项目会被苹果拒绝。

所以以下主要是讲解静态库的创建及使用

静态库可用于代码的共享与重用,开发第三方SDK……

制作.a

新建项目 选择“Cocoa Touch Static Library”如下图:
这里写图片描述

创建好项目后需要配置一下工程文件,buildSetting 中设置 build Active Architecture only 为NO让静态库支持所有架构
这里写图片描述
创建一个测试类 StaticTool 继承自NSObjec 并在StaticTool中添加一个类方法+(void)shareTest; 用于测试.a文件的使用

这里写图片描述

将需要暴露出去的头文件添加到copy File 中如下图:
这里写图片描述
未经过编译的.a文件是红色的
这里写图片描述
编译后文件是黑色的
在编译钱先检查一下是debug还是release模式
这里写图片描述
这里就选择release模式
这里写图片描述
选择一个模拟器编译一下 (最好是选择一个高级一点的)
编译后查看此.a文件支持什么架构
这里写图片描述

通过 lipo -info xxxx.a可查看.a文件支持什么架构
这里写图片描述
上图表示.a文件支持模拟器i386 和 x86_64架构,现在的.a文件还不支持真机架构,为了支持真机架构需要在真机模式下编译运行一下。
这里写图片描述
编译运行后可查看.a文件
这里写图片描述
两个文件夹都有.a文件,使用中需要将这两个文件夹中的.a文件进行合并才能同时支持模拟器跟真机架构,为了 方便操作, 我将Release-iphoneos和Release-iphonesimulator这两个文件拷贝到桌面一个文件夹test中
这里写图片描述
在终端中使用lipo -create xxx.a xxx.a -output xxx.a 可以合并生成一个新的.a文件
tip:生成新的.a文件需要指定放在那里 我这里就指定放在test文件夹内,如下:
这里写图片描述
检验一下新合并好的.a文件支持什么架构
这里写图片描述
现在.a文件支持既模拟器又支持真机架构了,测试一下.a文件的使用,新建一个项目,将.a文件拖入到项目中,并将暴露出来的.h文件也拖到项目中,如下:
这里写图片描述
在ViewController.m中导入#import “StaticTool.h”测试使用
这里写图片描述
运行后点击屏幕输出结果如下:
这里写图片描述
真机运行测试输出也是正常的,证明此.a文件同时支持真机跟模拟器架构

制作.framework

新建一个项目 选择 Cocoa Touch Framework
这里写图片描述
创建后的项目如下:
这里写图片描述
需要配置一下文件如下:
这里写图片描述
这里写图片描述
为了方便测试,把刚刚创建的StaticTool 直接拖到项目中,方便测试.framework的使用
如果.framework中使用的类比较多,可以将相对应的类头文件导入到FrameworkDemo.h文件中,如下:
这里写图片描述
将需要暴露的头文件 拖到public中
这里写图片描述

接下来的操作跟.a的操作类似 运行前确认是在debug还是release模式下,真机跟模拟器分别运行后 都会生成各自的framework文件,这时候需要将模拟器跟真机的framework文件合并才能同时支持两者。

同样是使用lipo -create xxx xxx -output xxxx合并两个framework文件如下:
这里写图片描述
用lipo -info xxx查看新生成的framework文件支持什么架构,如下:
这里写图片描述
可以看出framework同时支持真机跟模拟器架构
接下来就是测试使用framework,将新生成的framework 文件拖入到Release-iphoneos/FrameworkDemo.framework中进行替换里面的framework
这里写图片描述
将替换好后的FrameworkDemo.framework包脱到测试项目中如下:
这里写图片描述
分别在真机跟模拟器运行 都能正常输出

.a与.framework的区别
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
开发中建议用.framework.

结合.framework一般会在项目中使用到.bundle文件用来存放资源,比如图片
bundle文件的创建如下:
这里写图片描述
可以将图片放在.bundle目录下:
这里写图片描述
在framework 中定义一个类方法 用于测试获取bundle文件资源
这里写图片描述
这里写图片描述
重新编译一下,将.framework文件导入到测试运行项目中测试

#import "ViewController.h"#import <FrameworkDemo/FrameworkDemo.h>@interface ViewController ()@property (nonatomic,strong) UIImageView *imageView;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {    [StaticTool shareTest];    UIImage *image = [StaticTool imageWithBundleName:@"resource" imageName:@"Snip20170521_33"];    self.imageView.image = image;    [self.view addSubview:self.imageView];}- (UIImageView *)imageView {    if (!_imageView) {        _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];    }    return _imageView;}

点击屏幕 可以显示获取到图片 测试成功
以上便是 .a,.framework和.bundle文件的创建和使用