静态库的制作
概念
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现,比如SDWebImage、AFNetworking。。。
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库:.a 和 .framework
动态库:.dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(右图所示)
PS:项目中如果使用了自制的动态库,不能被上传到AppStore
制作.a静态库
1.Xcode ->Framework&Library(iOS) -> Coca Touch Static Library
2.添加需要制作的.m文件
3.添加需要暴露出来的.h文件
4.选择模拟器或真机 打包
模拟器(X86_64)和真机(armv7,arm64...)打包出来的.a文件支持不同的CPU架构
用 lipo –info libXXX.a 可以查看 .a 支持的CPU类型
可以合并模拟器和真机的.a文件使之同时支持模拟器和真机上运行
lipo -create Debug-iphoneos/libXXX.a Debug-iphonesimulator/libXXX.a -output libXXX.a
(PS:若.a有自己的资源文件,一般制作成Bundle 最终交付的为:.a + .h + Bundle
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的今后在使用.a时一定注意版本
)
制作.framework
》 Xcode6 之前没有模板制作framework,必须自己手工制作,很是繁琐。
可以借助github上的开源模板制作 https://github.com/kstenerud/iOS-Universal-Framework
(在终端下进入iOS-Universal-Framework/Fake Framework文件夹,执行指令./install.sh安装模板)
》Xcode6后,可以直接用Xcode提供的模板
Xcode ->Framework&Library(iOS) -> Coca Touch Dynamic Library
(PS: 系统模板生成的framework是动态库,appstore是不允许有自制的动态framework的,因此需要修改成静态framework
选中framework在Build Setting->Linking->Mack-O Type 中选择Static Library即可转为静态framework
)
制作静态注意点
0).a和.framework区别
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用
(图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致
bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
)
1)多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件
使用静态库时,只需要#import 主头文件(实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>)
2)静态库中包含了Category
如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC