前言
在做项目的时候我们经常会用到别人封装好的资源,我们会看到有的资源是.a、.bundle文件,有的是.framework文件,那么.framework文件是怎么生成的呢?接下来我会用图形和文字给大家详细说明一下。
一、什么是库
库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。
静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。
二、什么是.a、.bundle、.framework
在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库。
二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。 .a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。
三、静态库使用的必要性
1>. 代码的共享与重用
2>. 程序模块化
3>. 分享给别人代码库时代码隐藏
4>. 开发第三方SDK
步骤
1.打开xcode,新建工程
选择“Framework & Library”,然后next
2.创建功能类
创建一个继承自NSObject的People类。
3.实现功能
在新创建的类里面声明方法并实现。这里我写一个buy的方法,以便后面测试使用。
在People.h文件里面
#import <Foundation/Foundation.h>
@interface People : NSObject
+ (void)buy;
@end
在People.m文件里面
#import "People.h"
@implementation People
+ (void)buy
{
NSLog(@"buy");
}
@end
4、更改参数
这里贴上Xcode基本操作
http://blog.csdn.net/phunxm/article/details/17044337
5、设置Headers
将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,当然,隐藏的头文件就无法再被引用。
然后需要在CustomFramework.h(必须是公开的,否则无法引用)中将你所有要公开的.h引入
打包Framework
1.选中模拟器,编译程序(cmd+B)
2.选中测试机,编译程序(cmd+B)
3.在finder中找到framework文件
找到下图中所示的CustomFramework文件,一个是Debug-iphoneos(真机)下的,一个是Debug-iphonesimulator(模拟器)下的。
使用xcode自带的lipo可以合并两个版本:在终端下使用命令:lipo -create /User/...../release-iphoneos/xxx.framework/xxx /User/...../release-iphonesimular/xxx.framework/xxx -output ./xxx
其中xxx为你的库的名称,路径为生成的静态库的路径,然后把生成的xxx放到真机或者模拟器版的xxx.framework里面替换里面原有的xxx库