静态库 什么是静态库,它是我们在进行编译的时候(command+B)可以直接链接到的目标代码,在运行的时候就无需再次加载.后缀名为.a.(别人是无法看到静态库中的内容的,这样可以达到保密的效果)
有静态库相应地就有动态库,那什么又是动态库呢,它是我们在编译的时候不链接的目标代码而是在加载的时候才链接,后缀名为.o.
静态库的使用:
在项目的开发中经常会用到静态库.如果我们不希望别人看到我们代码的内部实现,我们就可以给别人一个静态库.
在使用静态库之前让我们先来创建静态库:
1.首先创建一个Project,选择Framework&Library中的Static Library
![](https://img-blog.csdn.net/20151104114433913?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20151104114448221?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
静态库创建之后,Xcode会为我们生成.h和.m文件,如下图.并且TARGETS处的小图标也会较之前有所变化.
![](https://img-blog.csdn.net/20151104114513299?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.实现静态库中的功能
静态库创建好之后我们就可以实现静态库的功能了,(在.h和.m文件中),实现的过程和我们平时写代码是一样的(.h声明, .m实现).
.h中的代码:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StaticLibrary1 : NSObject
/*
异步加载网络图片
参数1: 待加载的图片视图
参数2: 待加载的图片的URL
*/
+ (void)SL_setImageView:(UIImageView *)imageView withURL:(NSString *)url;
@end
.m中的代码:
#import "StaticLibrary1.h"
@implementation StaticLibrary1
+ (void)SL_setImageView:(UIImageView *)imageView withURL:(NSString *)url
{
// 执行效率高 更加简洁(block)
// 对应全局队列开启了一个异步任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 下载图片数据
NSURL * URL = [NSURL URLWithString:url];
NSData * data = [NSData dataWithContentsOfURL:URL];
UIImage * image = [UIImage imageWithData:data];
// 回调主线程
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新
imageView.image = image;
});
});
}
@end
3.下面就是生成相应的静态库.a文件了
首先编译一下.
![](https://img-blog.csdn.net/20151104114536596?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
此时生成的.a文件是红色的表明这不是一个实际存在的文件,为偶们无法在Finder中找到.这时我们需要选择真机然后再进行编译.
![](https://img-blog.csdn.net/20151104114551387?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
此时的.a文件变黑了,我们就可以在Finder中找到此文件了.
实际上会有两个.a文件,如下图
![](https://img-blog.csdn.net/20151104114608080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20151104114621357?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
它们分别是真机所需要的静态库和模拟器所需要的静态库.
针对真机和模拟器的静态库文件只能在一个平台下面使用,我们需要将两个静态库合并成一个在真机上和模拟器上都可以使用的静态库文件.
4.合并静态库
合并的方式不止一种,我们选择利用终端的方式
![](https://img-blog.csdn.net/20151104114638330?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
生成了.a文件,表明合并成功.
5.使用静态库
接下来就让我们来用一下我们自己创建的静态库
新建一个工程,并将静态库和.h文件导入工程.
![](https://img-blog.csdn.net/20151104114909333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在代码中使用静态库:
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:imageView];
[StaticLibrary1 SL_setImageView:imageView withURL:@"http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg"];
有静态库相应地就有动态库,那什么又是动态库呢,它是我们在编译的时候不链接的目标代码而是在加载的时候才链接,后缀名为.o.
静态库的使用:
在项目的开发中经常会用到静态库.如果我们不希望别人看到我们代码的内部实现,我们就可以给别人一个静态库.
在使用静态库之前让我们先来创建静态库:
1.首先创建一个Project,选择Framework&Library中的Static Library
静态库创建之后,Xcode会为我们生成.h和.m文件,如下图.并且TARGETS处的小图标也会较之前有所变化.
2.实现静态库中的功能
静态库创建好之后我们就可以实现静态库的功能了,(在.h和.m文件中),实现的过程和我们平时写代码是一样的(.h声明, .m实现).
.h中的代码:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StaticLibrary1 : NSObject
/*
异步加载网络图片
参数1: 待加载的图片视图
参数2: 待加载的图片的URL
*/
+ (void)SL_setImageView:(UIImageView *)imageView withURL:(NSString *)url;
@end
.m中的代码:
#import "StaticLibrary1.h"
@implementation StaticLibrary1
+ (void)SL_setImageView:(UIImageView *)imageView withURL:(NSString *)url
{
// 执行效率高 更加简洁(block)
// 对应全局队列开启了一个异步任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 下载图片数据
NSURL * URL = [NSURL URLWithString:url];
NSData * data = [NSData dataWithContentsOfURL:URL];
UIImage * image = [UIImage imageWithData:data];
// 回调主线程
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新
imageView.image = image;
});
});
}
@end
3.下面就是生成相应的静态库.a文件了
首先编译一下.
此时生成的.a文件是红色的表明这不是一个实际存在的文件,为偶们无法在Finder中找到.这时我们需要选择真机然后再进行编译.
此时的.a文件变黑了,我们就可以在Finder中找到此文件了.
实际上会有两个.a文件,如下图
它们分别是真机所需要的静态库和模拟器所需要的静态库.
针对真机和模拟器的静态库文件只能在一个平台下面使用,我们需要将两个静态库合并成一个在真机上和模拟器上都可以使用的静态库文件.
4.合并静态库
合并的方式不止一种,我们选择利用终端的方式
首先在终端上输入lipo -create,然后将两个静态库文件拖到终端中,再在最后输入-ouput 紧跟一个路径,这是合并后的静态库存放的位置.
生成了.a文件,表明合并成功.
5.使用静态库
接下来就让我们来用一下我们自己创建的静态库
新建一个工程,并将静态库和.h文件导入工程.
在代码中使用静态库:
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:imageView];
[StaticLibrary1 SL_setImageView:imageView withURL:@"http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg"];