iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

时间:2021-10-15 14:35:38

一、概念篇

什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库的存在形式
静态库:.a 和.framework
动态库:.dylib 和.framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

需要注意的是:

动态库,不能被上传到AppStore(逼格太高 大苹果可是不允许的哈  哈哈)

总结:个人觉得 .a静态库的 本身就是一个对代码或者一个功能的封装,只不过是不开源的。

二、制作流程(如下均是Xcode7展示的操作)

新建一个纯净的项目-> 选择 “Cocoa Touch Static Library”

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

输入想要打包的静态库的名称

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

把库需要包含的源代码拖入此项目中

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

此处有一些注意点见下图

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中
iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
分别选择模拟器和真机(并不需要真正的手机),依然Command+B ,模拟器和真机环境下用的.a文件是分开的
iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

这一步,如果看到.a文件由红变黑说明编译等都没有问题  已经完成一半了

右击“ShowInFinder”,查看制作好的.a文件

niOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
Debug-iphoneos文件夹里面的东西是用在真机上的
Debug-iphonesimulator文件夹里面的东西是用在模拟器上的

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

在终端输入指令
首先文件切换到 Products文件夹  
iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
然后输入

lipo -createDebug-iphoneos/libXXX.a Debug-iphonesimulator/libXXX.a  -output  libXXX.a

蓝色部分是固定指令
红色、紫色是真机和模拟器.a文件的路径
绿色是所合成.a文件的路径
.a文件的体积(一般情况下)
真机用的.a> 模拟器用的.a

所合成.a== 真机用的.a+ 模拟器用的.a

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

使用.a 静态库

现在.a静态库和头文件都有了就可以把它们拖到项目中使用了

使用时直接#import"xxx.h"就可以直接导入调用使用了

至此,静态库算是制作完了,但是有以下几点需要说明

无论是 .a 静态库还是.framework 静态库,最终需要的都是:
二进制文件 +.h+ 其它资源文件

倘若自己所需要打包的静态库代码中用到了别人的三方框架比如“AFNetworking”等,此时只需要把用到的三方库文件的头文件在选择暴露头文件时都给暴露出去,然后导入的项目中如果也用到了相同的三方框架,此时此项目就不需要拖入这个三方库代码直接,需要使用时直接把你所提供的.a静态库和头文件导入 然后#import你所提供的相关头文件即可使用(注意:一定是以你的打包的为准)比如 直接#import"xxx.h"

若是自己的静态库原代码中使用了分类  比如NSString+xxxx,此时一定需要更改下项目的环境配置
添加一个“-ObjC”(注意"O""C"是大写的)

iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)