静态库:(.a, .framework)
在链接时,会被完整的复制到可执行文件中,被多次使用,就有多次拷贝(比如手机上多个应用都用到同一个静态库,这个静态库会复制到各个应用中),开发中基本都用这个,在MRC下打包的静态库,可以直接运行在ARC,这个特性可以帮助我们在使用一些MRC库的时候,不需要再去挨个头文件去加编译选项了,而且可以提高工程的编译速度
动态库:(.dylib, .framework)
只有一份,不会复制,程序运行时动态加载到内存,系统只加载一次,多个程序公用,节省内存
但是项目中如果使用到自己的动态库,不允许上架,再但是iOS8开放动态加载dylib的接口,也就是开放了动态库挂载,不过开发者用的并不多
(新建一个工程,或者target,其实就是一个新的target)
制作.a静态库
生成静态库时需要注意静态库支持的架构
模拟器:
4s---5: i386
5s---: x86_64
真机:
3gs---4s: armv7
5/5c : armv7s(armv7兼容armv7s)
5s---: arm64
使用终端查看一个静态库文件支持的架构
lipo -info [.a文件]
兼容所有模拟器,将build setting中build active architecture only(仅编译活跃结构)设置为NO
兼容所有真机同上
另外还有debug和release两种模式
debug:包含完整的符号信息,方便调试,不会对代码进行优化
release:不会包含完整的符号信息,会对代码进行优化,包会小一点,速度会快一点
.a 文件的合并
lipo -create [.a文件] [.a文件] -output hebing.a
合并哪些看需求
.a 文件的分解
lipo -remove i386 [.a文件] -output noi386.a //移除一个
lipo -thin arm64 [.a文件] -output arm64.a //只要一个
制作.framework静态库
机型兼容的设置方法同.a
查看支持机型,同样使用lipo -info [framework文件],但是这个文件是
使用file [framework文件] ,可以查看这个framework是静态库还是动态库
若要制作静态库,还需在build setting中设置Mach-O Type为Static Library,默认是动态库
在制作静态库的时候,最好把资源(图片等)放到一个.bundle中,使用静态库的时候,可以手动把这个bundle拖到工程中,这样做是避免资源被拷贝到mainBundle中,与已有资源发生冲突,如果不用bundle的话,也可以使用引用物理文件夹的方式
合并与分解的操作同.a,但是操作的文件是上图所示的文件
注:如果要使用动态库,需要在General/Embedded Binaries中引入这个库