什么是库?
根据源代码的公开情况,库可以分为2种类型
为什么制作闭源库
静态库
静态库的特点
.a +.h
步骤
创建一个类方法,实现简单的加法
+ (double) sumNum1:(double) x andNum2:(double) y;
+ (double)sumNum1:(double)x andNum2:(double)y
{
return x + y;
}
真机(arm)
| 模拟器(i386)
红色
表示没有生成.a文件,如果是黑色
表示生成了.a文件测试生成的静态库
新建ToolsTest的iOS项目
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
double rs = [Tools sumNum1:10.4 andNum2:20.5];
NSLog(@"%lf",rs);
}
输出结果:30.9
步骤:简单静态库的基础上
提供获取图片资源的方法
+ (UIImage *) logoOfItcast;
+ (UIImage *) logoOfItheima;
+ (UIImage *) lufei;
编译,编译后的include
文件夹中没有我们刚刚添加的CZResourceTools.h文件,解决方法 项目
->TARGETS
->Build Phases
->Copy Files
->添加
需要头文件 如图
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UIImage *image = [CZResourceTools logoOfItcast];
NSLog(@"%@",image);
}
5.点击屏幕输出内容为:
ToolsTest[2260:252976] (null)
这是因为.a 文件中仅仅包含二进制的代码,不包含资源文件,如果你需要是资源还要把资源导入 6.导入静态库中使用的资,运行点击屏幕输出内容:
ToolsTest[2276:256084] <UIImage: 0x7fbf7bc25b30>, {202, 76}
这样使用静态库非常麻烦,并且与当前项目的资源混杂在一起,容易丢失
当静态库中包含一些固定的资源文件时候最好打包一个bundle,方便其他人使用
1. 新建一个文件夹命名为:resource(此处你可以根据需要随意命名)
修改资源加载路径,文件前面添加包路径
+ (UIImage *) logoOfItcast
{
return [UIImage imageNamed:@"resource.bundle/logo_itcast.png"];
}
+ (UIImage *) logoOfItheima{
return [UIImage imageNamed:@"resource.bundle/logo_itheima.png"];
}
+ (UIImage *) lufei{
return [UIImage imageNamed:@"resource.bundle/logo_itheima.png"];
}
.a
,.h
文件并导入resource.bundle
文件即可.运行,点击屏幕,输出内容:
ToolsTest[2276:256084] <UIImage: 0x7fbf7bc25b30>, {202, 76}
1. 真机-Debug版本
2. 真机-Release版本
3. 模拟器-Debug版本
4. 模拟器-Release版本
调试版
静态库,如何生成发布版
的静态呢?步骤:
1. 模拟器CPU架构:
1. iPhone4s,iPhone5->`i366`
2. iPhone5s以后->`x86_64`
2. 真机CPU架构:
1. iPhone3gs-->iPhone4s : `armv7`
2. iPhone5-->iPhone5c : `armv7s`
3. iPhone5s-->iPhone6plus : `arm64`
lipo -info 静态库.a
Build Settings
-->Build Active Architecture Only
-->NO
,如图:lipo -create 静态库1.a 静态库2.a -output 新静态库的名称.a
如图:
使用framework制作动态库
预习01-framework制作
编译,报错如下 MakeFrawork
项目让头文件暴露在外部
测试framework
FrameworkTest
MakeFramework.framework
ViewController.m
中导入头文件
#import <MakeFramework/MakeFramework.h>
调用framework中的方法
#import <MakeFramework/MakeFramework.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
int rs = [CZTools sumOfNum1:10 andNum2:20];
NSLog(@"%d",rs);
}
@end
运行测试项目,报错:
错误原因:默认情况下framework是动态库,使用的时候还需要添加到 embedded binaries
(被嵌入的二进制)
+
add
在再次运行项目,点击屏幕打印出 30
注意: 项目中如果使用了自制的动态库,在Xcode6之前不能被上传到.AppStore,Xcode6以后可以上传AppStore
使用framework也可以是静态库的形式,
target
-> Bulid Setting
-> Mach-O Type
-> Statuc Library
其实可以framework理解为是.a 文件与.h文件的合体,所以在使用上framework比.a文件更加方便,现在很多第三方框架使用的都是framework的形式.
原文:http://www.cnblogs.com/YRFios/p/4963475.html