库可以分为静态库和动态库,静态有.a和.framework,动态库有.framework、.dylib(iOS9之前)、.tbd(iOS9之后)。
相信很多朋友在做项目过程中,都会需要在工程中导入库,那么这个库又是怎么生成的呢,今天我们就开看一下一个静态库它的制作流程:
这里假设我们要制作一个异步加载网络图片的库(工程名:BHImage),首先我们要新建一个工程,注意要选择这个:
创建成功之后,打开左侧Products文件夹,我们会发现我们的库是红色的,它表示该库还没有生成
工程会默认是动态库(Dynamic Library),我们需要将它改为静态库(Static Library)才行:
选择TARGETS-->Build Settings搜索到Mach-O Type进行更改:
现在我们要新建一个UIImageView的类目(LoadImageURL)
然后你就会发现工程出错了,那是因为我们没有导入UIKit的原因,在类目的.m文件中导入#import <UIKit/UIKit.h>之后就没错了
然后我们要在BHImage.h中导入我们的类目(注意导入方式):
#import <BHImage/UIImageView+LoadImageURL.h>
现在我们就要为UIImageView扩展方法了:
#import <UIKit/UIKit.h>
.h文件中
@interface UIImageView (LoadImageURL)
//根据URL加载资源
- (void)bh_setImageURL:(NSURL *)url;
@end
在.m中实现:
#import "UIImageView+LoadImageURL.h"
@implementation UIImageView (LoadImageURL)
- (void)bh_setImageURL:(NSURL *)url{
//获取全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//异步加载网络资源
dispatch_async(globalQueue, ^{
//根据URL获取到图片的Data
NSData *data = [NSData dataWithContentsOfURL:url];
//Data->UIImage
UIImage *image = [UIImage imageWithData:data];
//主线程更新UI
dispatch_sync(mainQueue, ^{
self.image = image;
});
});
}
@end
到这里,我们的代码就写完了
Debug版的静态库生成:
任意选择一个模拟器运行程序,你就会发现库变成黑色的了,那就表示库(模拟器库:只在模拟器上可用)已经生成了,点击该库到finder中查看:
模拟器库并不能满足我们的需求,现在我们就要生成一个真机库了:
选中运行状态为:运行就会生成一个真机库了,再次查看:
Release版的静态库生成:
点击Product-->Scheme-->Edit Scheme,选择
跟上面操作一样,先选择任意模拟器运行,再切换Generic iOS Device运行,在次查看可发现:
就这样,还不能满足我们的需要,我们要让我们的静态库既可以在真机上可用还可以在模拟器上可用,那么我们现在要做的就是生成一个Release版(包含真机、模拟器)的静态库了:
新建一个文件夹(用于装我们新建的静态库),打开终端输入命令:
lipo -create 真机版HBImage 模拟器版HBImage -output 新建的文件夹/名字BHImage
操作示例:
回车之后,打开我们的新建文件夹,会发现新的BHImage文件已经生成了,就这样子它肯定是不能用的,只有库才可以用嘛,我们需要将它替换到真机库的BHImage中去:
将真机Release版中的库拷贝到新建的文件夹,删除其中的BHImage,然后将我们刚生成的BHImage拖入到其中,然后我们的静态库到这里也制作完成了(真机、模拟器均可用),是不是感觉很简单呀。。
现在我们就来用一用我们制作的静态库吧:
将我们手动集成的三方库导入到工程,设置:
选择TARGETS-->Build Settings搜索到Other Linking Flags点击添加-Objc:
导入头文件到需要使用的类中,调库中提供的方法:
#import <BHImage/BHImage.h>
//根据URL 获取图片
- (void)loadImage
{
for (int i = 0; i < self.datasource.count; i++) {
UIImageView *imageV = self.imageStore[i];
NSString *urlStr = self.datasource[i];
NSURL *url = [NSURL URLWithString:urlStr];
//******使用静态库方法
[imageV bh_setImageURL:url];
}
}
运行程序,使用我们自己制作的静态库来异步加载图片的成果就出来了: