iOS 静态库封装

1,725 阅读4分钟
原文链接: www.jianshu.com

静态库和动态库

静态库和动态库存在形式

  • 静态库:以.a 和 .framework为文件后缀名。
  • 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。

静态库和动态库的区别

  • 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
  • 动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。(注:在iOS8之前,程序中能够通过两种方式使用库文件,即.a和framework。.a是静态库的方式,framework本质上也是静态库的方式,只不过为了方便,将其打包为假的动态库。真正的动态库在iOS8之后。)

.a与.framework的区别

二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,以.framework可以单独使用。

对图片资源和UI界面xib或nib文件的处理

.a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。
.a文件中无法存放图片或xib文件,很容易理解,但是.framework从本质上说也是一个bundle文件,为什么不把图片或者xib文件直接放在.framework中而单独再创建个bundle文件呢?
那是因为iOS系统不会去描.framework下的图片等资源文件,也不会在项目中显示,也就是说即使放在 .framework目录下,系统根本就不会去扫描,因此也无法发现使用。

category的处理

category是项目开发中经常用到的,把category打包成静态库是没有问题的,但是在使用这个静态库时,调用category中的方法时会发生找不到该方法的运行时错误(selector not recognized)解决的办法如下:

  • 如果,第三库中没有 category,Other Linker Flags 无需设置
  • 如果,第三方库中有 category,需要设置为 -ObjC
  • 如果,某些 Xcode 版本中,出现问题,修改设置为 -all_load

运行模式

arm7: 在最老的支持iOS7的设备上使用
arm7s: 在iPhone5和5C上使用
arm64: 运行于iPhone5S的64位 ARM 处理器 上
i386: 32位模拟器上使用
x86_64: 64为模拟器上使用
注意:向下兼容,arm7版本可以做arm7s上运行

.a静态库制作

1、新建项目-> 选择 “Cocoa Touch Static Library”


1.png

2、添加库需要包含的源代码,将你工程里的代码添加到打静态库工程里:

3、配置工程:


2.png


注:需要修改Build Settings中的 Build Active Architecture Only 以满足运行不同CPU环境的模拟器。 将此设置为NO。
当为YES的时候,在什么环境下编译静态库就支持什么环境。

4、选择需要暴露出来的 .h 文件, .m 文件会自动编译到 .a 文件中:


3.png

注:在工程对应的target的“Build Phases”下添加“Headers”的选项。该选项默认是没有的,添加方法是点击下方的“Add BuildPhase”按钮后选择后即可添加。该选项下有3个子选项,分别是Public,Private,Project。通过点击下方的加号,可以将工程中的头文件添加到“Project”中,在其中的对应头文件点击右键,选择“Moveto PublicGroup”,当头文件移到“Public”后,编译工程以后,在工程编译后.a文件所在的路径下,会同时出现一个"usr/local/include"的文件夹,其中的头文件就是public group中的头文件。这时只需将.a文件和这个路径下的头文件拷贝到所需工程文件即可。

5、编译静态库
选择真机设备,然后 Command+B 编译,静态库文件从红色变为黑色
选择模拟器,然后 Command+B 编译 ,静态库文件从红色变为黑色。
模拟器和真机环境下用的.a文件是分开的
选择Scheme可以编译出debug和release不同版本的静态库
如图:


4.png

6、合并.a文件
如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并。
在终端输入指令:
lipo -create 静态库路径1 静态库路径2 -output 静态库路径3
路径1和路径2可以通过直接拖拽静态库文件获取,路径3为保存的路径

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