知识普及:
什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为 2 种类型
开源库
公开源代码,能看到具体实现
比如 SDWebImage 、 AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库
静态库和动态库的存在形式
静态库: .a 和 .framework
动态库: .dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝 (左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存 (右图所示)
需要注意的是:以前项目中如果使用了自制的动态库,不能被上传到 AppStore!但是现在是可以了,给海尔的一个项目打得动态库,也没问题。
制作 .a
1、新建项目-> 选择 “Cocoa Touch Static Library”
2、添加库需要包含的源代码,将你工程里的代码添加到打静态库工程里:
3、配置一下工程:
4、选择需要暴露出来的 .h 文件, .m 文件会自动编译到 .a 文件中:
需要暴漏出的文件类在这里设置:
引入的网络框架设置:(有些会自动引入,有些需要手动引入,根据编译报错,可以检查。)
5、编译前检查一下是debug模式还是release模式,选择release模式:
分debug和release模式:
Debug-iphoneos 文件夹里面的东西是用在真机上的
Debug-iphonesimulator 文件夹里面的东西是用在模拟器上的
如果 Scheme 是 Release 模式,生成的文件夹就以 Release 开头
6、选择真机设备,然后 Command+B 编译, libSPCustomerServerse.a 文件从红色变为黑色
(注意建议先选择真机,这样才会变色,如果先选择模拟器,那么编译通过了,但是不会由红变黑,实际上是已经编译了模拟器的,只是给人一种假象,好像没编译一样,还是红色的)
7、选择模拟器,建议选择iPhone6以上的(选择高级点的,低级的也可用,若选了低级的,高级的有可能就不适配了)然后依然 Command+B 编译,模拟器和真机环境下用的 .a 文件是分开的。
8、合并模拟器(release-iphonesimulator)和真机(release-iphoneos)下的.a,以便支持真机和模拟器,合并后的.a大小大约是不合并的2倍左右。
show in finder
合并步骤:
举例:1、新建文件夹:"dabao";
2、将上述的release-iphonesimulator和release-iphoneos两个文件拷贝进"dabao"文件夹。
3、打开终端,执行以下操作:
一、在终端输入:lipo -create
二、将release-iphonesimulator下的.a拖进终端,输入一个空格;
三、继续将release-iphoneos 下.a 拖进终端,输入空格;
四、继续输入:-output ,打个空格;
五、输入合并后的.a所要放的文件路径(这里举例依然放在“dabao”这个文件夹下,则我的电脑的路径为:/Users/ntalker-zhou/Desktop/dabao/libSPCustomerServerseSDK.a),回车,在相应的文件下即可生成一个.a,该.a即是合并后的.a
4、检查合并后的.a是不是满足所有要求,依然在终端进行以下操作:
一、在终端输入:lipo -info ;
二、将合并后的.a拖进终端 ,回车;
(注意:终端每一步记得要用空格隔开,否则会出错哦!)
这样.a 就成功制作出了,只需要将暴漏的头文件以及制作的.a放入工程,别人就可以使用你的程序了,再也不用担心源码暴漏或别人随意修改你的代码了,不过如果有图片资源,图片资源是不能打进.a的,需要在外面添加的哦。
(有时候为了编译通过,根据需要,需要设置一下工程配置比如我需要配置xml等…
另外Xcode 12打包framework 报错:have the same architectures (arm64) and can't be in the same fat output file
解决办法参考:https://www.jianshu.com/p/781795e98444