一.库的介绍
什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
●开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking
●闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库的区别
二.静态库.a文件的制作
1.选择Coca Touch Static Library
2.输入静态库名称
3.添加库所需要的源代码
4.在Build Phases选择New Copy Headers Build Phase
将需要暴露的头文件添加进去
默认是添加到项目中
拖上去
5.选择真机设备,然后 Command+B编译,libMJRefresh.a文件从红色变为黑色
选择模拟器,依然Command+B,模拟器和真机环境下用的.a文件是分开的
6.右键show in finder 查看文件
Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的
如果Scheme是Release模式,生成的文件夹就以Release开头
①在终端进入两个静态库的上一个文件夹
②在终端输入指令
lipo -createDebug-iphoneos/libMJRefresh.aDebug-iphonesimulator/libMJRefresh.a-
outputlibMJRefresh.a
蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径•绿色是所合成.a文件的路径
通过lipo –infolibMJRefresh.a可以查看.a的类型(模拟器还是真机 )
③回车
如何使用静态库?
直接将.a、.h、资源文件拖拽到其他项目中即可
①可能会报错?因为分类的内容默认是没有链接进来的
解决办法.把所有的OC都链接进来
②可能会报错,如果不只有Fundation框架,按照上面的步骤会报错
解决办法:在pch文件包含需要的框架
(.a文件只有二进制文件,没有资源文件,.framework是什么文件都包括了)
注意:如果原来的项目中有bundle文件,在制作完成,a文件后要把bundle文件.a文件和暴露的文件一块放到其他项目中使用
三..framework文件的制作
1.选择“OS X”-“Framework & Library”-“Bundle”
2.输入静态库名称
3.修改项目环境
①修改为ios
②修改Linking
③修改Packaging
④修改Imfo.plist文件
4.添加库需要的源代码和资源文件
5.把需要打包的bundle文件添加进去
6.添加需要暴露出来的.h文件
7.添加需要暴露出来的.h文件,并且放到Public下面
8.注释掉pch文件的内容
9.接下来的步骤跟 .a 是一样的,分别选择真机和模拟器,Command+B
真机和模拟器下的 .framework 也是分开使用的
生成的framework在Xcode的缓存文件夹中
/Users/用户名/Library/Developer/Xcode/DerivedData/项目名/Products
可以在终端下使用lipo指令合并.framework,需要合并的是framework里面的某个文件
10.最后将framework调整一下即可
11.直接拖拽整个 .framework 到其他项目的Frameworks文件夹下,然后包含主头文件:#import
补充:上面制作.framewo文件修改项目配置比较麻烦,我们可以使用iOS-Universal-Framework 用他自己的模板创建,省掉了配置环境麻烦
①
手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单
模板地址:
https://github.com/kstenerud/iOS-Universal-Framework
安装模板:
在终端下进入iOS-Universal-Framework/Fake Framework文件夹
执行指令./install.sh
②安装模板后,完全重启Xcode
关于静态库的注意点:
无论是.a静态库还是.framework静态库,最终需要的都是:
● 二进制文件+ .h +其它资源文件
a 和.framework的使用区别
● .a本身是一个二进制文件,需要配上.h和 其它资源文件 才能使用
● .framework本身已经包含了.h和 其它资源文件,可以直接使用
图片资源的处理
● 如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟.a或.framework名字一致
● bundle的创建:新建一个文件夹,修改扩展名为.bundle即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
多文件处理
● 如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
● 在主头文件中包含所有其他需要暴露出来的.h文件
● 使用静态库时,只需要#import主头文件
● 实际上苹果官方就是这么做的,例如:#import
● .framework为什么既是静态库又是动态库
● 系统的.framework是动态库
● 我们自己建立的.framework是静态库
注意:上面我们制作的都是debug模式下的静态库,实际上我们还需要release模式下的真机上的静态库,修改下图,然后重新cmd +b 编译一下
会发现多了一个,其实直接用release的就好了
总结:以后我们直接制作release模式下的真机运行的静态库就好了
关于denug和release阶段的区别:
debug:程序调试阶段,
比较耗内存,因为需要实时检测有没有错误和打印错误信息
release阶段:打包完毕,发布阶段
不那么耗内存
所以我们程序发布阶段,最好调为release模式运行一下