iOS静态库的制作

库可以分为静态库和动态库,静态有.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];
    }
}
运行程序,使用我们自己制作的静态库来异步加载图片的成果就出来了:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值