iOS-静态库

一.库的介绍

什么是库?
库是程序代码的集合,是共享程序代码的一种方式

根据源代码的公开情况,库可以分为2种类型

开源库
公开源代码,能看到具体实现
比如SDWebImageAFNetworking

闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现

主要分为:静态库、动态库 


静态库和动态库的区别

iOS-静态库_第1张图片

二.静态库.a文件的制作

1.选择Coca Touch Static Library

iOS-静态库_第2张图片

2.输入静态库名称

iOS-静态库_第3张图片

3.添加库所需要的源代码

iOS-静态库_第4张图片

4.在Build Phases选择New Copy Headers Build Phase

iOS-静态库_第5张图片

将需要暴露的头文件添加进去

iOS-静态库_第6张图片

默认是添加到项目中

iOS-静态库_第7张图片


拖上去

iOS-静态库_第8张图片


5.选择真机设备,然后 Command+B编译,libMJRefresh.a文件从红色变为黑色 

iOS-静态库_第9张图片

选择模拟器,依然Command+B,模拟器和真机环境下用的.a文件是分开的 

iOS-静态库_第10张图片


6.右键show in finder 查看文件

iOS-静态库_第11张图片

Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的

如果SchemeRelease模式,生成的文件夹就以Release开头 

7.合并.a文件

①在终端进入两个静态库的上一个文件夹


在终端输入指令

lipo -createDebug-iphoneos/libMJRefresh.aDebug-iphonesimulator/libMJRefresh.a-

outputlibMJRefresh.a
蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径绿色是所合成.a文件的路径 

iOS-静态库_第12张图片

通过lipo –infolibMJRefresh.a可以查看.a的类型(模拟器还是真机 )

③回车

iOS-静态库_第13张图片

如何使用静态库?

直接将.a.h、资源文件拖拽到其他项目中即可 

iOS-静态库_第14张图片


①可能会报错?因为分类的内容默认是没有链接进来的



解决办法.把所有的OC都链接进来

iOS-静态库_第15张图片


②可能会报错,如果不只有Fundation框架,按照上面的步骤会报错


解决办法:在pch文件包含需要的框架

iOS-静态库_第16张图片

(.a文件只有二进制文件,没有资源文件,.framework是什么文件都包括了)

注意:如果原来的项目中有bundle文件,在制作完成,a文件后要把bundle文件.a文件和暴露的文件一块放到其他项目中使用



三..framework文件的制作

1.选择“OS X”-“Framework & Library”-“Bundle” 

iOS-静态库_第17张图片

2.输入静态库名称 

iOS-静态库_第18张图片

3.修改项目环境

①修改为ios

iOS-静态库_第19张图片

②修改Linking

iOS-静态库_第20张图片


③修改Packaging

iOS-静态库_第21张图片

④修改Imfo.plist文件

iOS-静态库_第22张图片


4.添加库需要的源代码和资源文件

iOS-静态库_第23张图片




5.把需要打包的bundle文件添加进去

iOS-静态库_第24张图片

6.添加需要暴露出来的.h文件 

iOS-静态库_第25张图片

7.添加需要暴露出来的.h文件,并且放到Public下面 

iOS-静态库_第26张图片


8.注释掉pch文件的内容 

iOS-静态库_第27张图片


9.接下来的步骤跟 .a 是一样的,分别选择真机和模拟器,Command+B

真机和模拟器下的 .framework 也是分开使用的

 生成的frameworkXcode的缓存文件夹中

/Users/用户名/Library/Developer/Xcode/DerivedData/项目名/Products

可以在终端下使用lipo指令合并.framework,需要合并的是framework里面的某个文件


iOS-静态库_第28张图片

10.最后将framework调整一下即可

iOS-静态库_第29张图片

11.直接拖拽整个 .framework 到其他项目的Frameworks文件夹下,然后包含主头文件:#import 

iOS-静态库_第30张图片


补充:上面制作.framewo文件修改项目配置比较麻烦,我们可以使用iOS-Universal-Framework 用他自己的模板创建,省掉了配置环境麻烦

iOS-静态库_第31张图片

手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单

模板地址:

https://github.com/kstenerud/iOS-Universal-Framework

安装模板:

在终端下进入iOS-Universal-Framework/Fake Framework文件夹

执行指令./install.sh 

安装模板后,完全重启Xcode 

iOS-静态库_第32张图片


关于静态库的注意点:

  • 无论是.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 编译一下

iOS-静态库_第33张图片

会发现多了一个,其实直接用release的就好了


总结:以后我们直接制作release模式下的真机运行的静态库就好了

关于denug和release阶段的区别:

debug:程序调试阶段,

比较耗内存,因为需要实时检测有没有错误和打印错误信息

release阶段:打包完毕,发布阶段

不那么耗内存

所以我们程序发布阶段,最好调为release模式运行一下


你可能感兴趣的:(其他)