iOS静态库简介
1.库的理解
- 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
- iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。
2.静态库与动态库的区别?
- 静态库: 链接时完整地拷贝至可执行文件中,手机中的应用只要引用到某个静态库,就会拷贝,多个应用之间不共用同一份静态库。
- 动态库: 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。[ios暂时只允许使用系统动态库];
- 静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。
总结:同一个静态库在不同程序中使用时,每一个程序中都得导入一次,打包时也被打包进去,形成一个程序。而动态库在不同程序中,打包时并没有被打包进去,只在程序运行使用时,才链接载入(如系统的框架如UIKit、Foundation等),所以程序体积会小很多,但是苹果不让使用自己的动态库,否则审核就无法通过。
3.framework为什么既是静态库又是动态库?
- 系统的.framework是动态库,我们自己建立的.framework是静态库。
4..a与.framework有什么区别?
- .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
- .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
- .a + .h + sourceFile == .framework。
- 不建议把资源文件(图片,xib,storyboard)打包到.framework里面,因为放进去后,需要把这个framework添加到Build Phases/Copy Bundle Resources里面,这样会增加包的大小,建议还是另外放在一个bundle里面。
5.为什么要使用静态库?
- 方便共享代码,便于使用
- 可以实现源码的保密
- 实现iOS程序的模块化
- 方便OC Swift混编
6.苹果静态库的版本问题
- 分为Debug版和Release版两种。Debug版不包含符号信息,没有做代码优化。一般都打包成Release。
- Debug版和Release版静态库又可各分为模拟器版本和真机版本
- 如果合成的静态库需要在模拟器和真机上都能运行,需要合成模拟器版本和真机版本的静态库
7. 苹果静态库支持的指令集说明
- armv7:iPhone4s(真机,兼容armv7s)
- armv7s:iPhone5/5c(真机,苹果默认不输出此版本静态库,需要在BuildingSetting里手动设置添加)
- arm64:iPhone6 iPhone6 plus以后(真机)
- i386 模拟器32位
- x86_64 模拟器64位
8.静态库信息查询指令
- 查询:lipo -info xxx
- 合成:lipo -create xxx/Release-iphoneos/xxx.framework/xxx xxx/Release-iphonesimulator/xxx.framework/xxx -output xxx