OC中库的种类
静态库
- .a
- .framework(被苹果官方逼出来的产物)
动态库
- framework
- dylib(苹果官方专用)
静态库和动态库在使用上的区别
- 静态库在链接的时,会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝
- 动态库在链接的时候不会复制,程序运行的时候由系统动态加载到内存,共程序使用系统只加载一次,多个程序共用,节省内存
为什么苹果不推荐我们使用自己做的动态库
- 由于动态库是供多个应用程序使用的,如果我们使用了动态库到用户的手机上,可能动态库上的某些方法名字或者函数名字跟其他动态库有冲突,到时候会造成系统的一团乱糟
静态库(.a)的制作过程
-
注意
: 如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance),在使用静态库的工程中配置other setting
->Other Linker
Flags为-ObjC
- 创建一个静态库,把里面产生的源文件删除
- 如果库文件比较多,我们要注意先到
target
->Build Phases
-> 点+号创建 Headers 出来 - 把要编译的库源文件拖到项目中
- 到
target
->Build Phases
->Headers
中选择库文件中要暴露出来的头文件(拖到public)中 - 一般我们都要编译两种文件给调用者
真机版本
+模拟器版本
,编译的时候我们分别选择iPhone
和iOS Device
两项来编译 - 如果没有特殊情况的话,在
Products
中可以看到.a文件
,如果显示红色代表不在项目文件夹中,这时候需要到xcode的缓存中寻找 :- (Finder)前往 -> 个人 -> 资源库 -> Develop -> Xcode -> DerivedData (/Users/mac/Library/Developer/Xcode/DerivedData) ,清空里面的东西
- 在分别选择模拟器和真机分别编译,注意,真机编译的时候可能会出现错误,但是.a能正常编译出来,错误不用管
- 在
Products
中得到两个版本的.a文件,为了方便我们需要把两个版本的.a文件合并成一个版本 -
终端中的合成指令
: lipo -create模拟器 .a 文件所在目录的路径
/.a文件名字
真机 .a 文件所在目录的路径
/.a文件名字
-output要合成的 .a 文件名字,通常以lib为前缀
-
使用的使用注意事项
,把 暴露的头文件提供给调用者, .a文件相当于我们平常使用的.m文件,然后可以正常使用,如果要依赖其他资源文件(例如.bundle文件),要一块提供给调用者
查看一个静态库所支持的 CPU 构架
lipo -info .a全路径
各版本的CPU构架
armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch
armv7 iPhone4 iPhone4S
armv7s iPhone5 iPhone5C
arm64 iPhone5S