菜鸟教程——iOS动态库与静态库
一.简介
库是编程中常用的数据包,更加方便的共享代码,提高开发效率,增加程序健壮性和安全性,iOS中的库可以分为动态库和静态库,两者的区别就是静态库在编译时把二进制文件完整的拷贝的可执行文件中,多次使用会造成冗余,这无疑加重了程序的负荷。而动态库则不同,在编译的时候并不进行拷贝,而是在运行的时候系统动态加载到内存,也只会加载一次,节省内存,苹果是不支持开发者自行创建动态库并用于发布,这样的项目是不会通过appleStore审核的,虽然iOS8苹果开放了api接口支持动态加载动态库。
二.动态库和静态库格式区别
动态库: .dylib(现在一般为.tdb)和 .framework
静态库: .a和 .framework
三.创建动态库和静态库的注意事项
1.架构
armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。
还有两个我们也很熟悉的指令集:i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。x86_64是针对x86架构的64位处理器。所以当使用iOS模拟器的时候会遇到i386|x86_64,iOS模拟器没有arm指令集。
模拟器:
iPhone4s-iPnone5:i386
iPhone5s-iPhone7 Plus:x86_64
真机:
arm64:iPhone5S| iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone3GS|iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch(一般不需要去支持)
四.创建动态库和静态库
1 .a静态库的制作
a).创建Xcode工程staticTest
创建好的工程如图所示
b)添加方法
c)修改配置信息
我们需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
(1)Architectures
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.
指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。
(2)Valid Architectures
Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.
限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定,例如:
比如,你的Valid Architectures设置的支持arm指令集版本有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。
再比如:将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s。
d).分别在Generic ios device 和真机,模拟器上编译程序,可以看到product文件由红边黑,右键找到文件。
可以看到模拟器和真机生成的.a 文件。
e).将两个.a文件合并成一个.a文件,同时支持模拟器和真机。
我们可以使用终端命令来实现。命令格式:lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径:
然后我们可以调用.h和.a文件运行到真机和模拟器上。
2 .framework静态库的制作
a).创建framework文件,创建后如图:
b).创建类并定义方法。
c).按照前面说的做相关配置,另外需要把自己用到的类从project拖拽到public里。
d).将Mach-O Type改为静态,这个默认是dynamic
e).分别编译,可以看到.frameWork边黑
f).右键打开,如图
g).将每个Framework文件下包含的testFrameWork二进制文件,合并生成同时支持真机和模拟器的文件包,
终端操作:lipo -create 第一个framework下二进制文件的绝对路径 第二个framework下二进制文件的绝对路径 -output 最终的二进制文件路径:
h).此刻已经完成库创建,使用的时候将生成的test二进制文件替换原真机或模拟器文件夹中生成的二进制文件即可。
注意:
如果静态库中有category类,则在使用静态库的项目配置中Other Linker Flags需要添加参数-ObjC或者-all_load。
如果创建的framework类中使用了.tbd,则需要在实际项目中导入.tbd动态库。