简介
- 什么是库?
- 库是程序代码的集合,是共享程序代码的一种方式
- 根据源代码的公开情况,库可以分为2种类型
- 开源库
- 公开源代码,能看到具体实现
- 比如SDWebImage、AFNetworking
- 闭源库
- 不公开源代码,是经过编译后的二进制文件,看不到具体实现
- 主要分为:静态库、动态库
静态库和动态库
静态库和动态库的存在形式
静态库:.a和.framework
动态库:.dylib和.framework使用上的区别
静态库:链接时,静态库会被完整复制到可执行文件中,被多次使用就会有多份冗余拷贝(见左图)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(见右图)
制作.a
选择Cocoa Touch Static Library
输入静态库名称
添加库需要包含的源代码
选择需要暴露出来的.h文件,对应的.m文件会自动编译到.a中
选择真机设备,然后Command+B编译,libMJRefresh.a文件名从红色变成黑色
选择模拟器,Command+B编译,模拟器和真机的.a文件是分开的
右击Show In Finder,查看制作好的.a文件
Debug-iphones文件夹里的东西是用在真机上的
Debug-iphonesimulator是用在模拟器上的
如果选择release编译,则生成的文件名为release开头
合并.a
如果需要.a能够用在真机和模拟器上,我们需要进行合并
在终端中输入:
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
可以通过lipo –info libMJRefresh.a命令可以查看 .a 的类型是模拟器还是真机
使用.a
直接将.a、.h和资源文件拖到项目中即可
模板制作.framework
- 手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单
- 模板地址: https://github.com/kstenerud/iOS-Universal-Framework
- 安装模板
在终端下进入iOS-Universal-Framework/Fake Framework文件夹
执行指令./install.sh
安装模板后,完全重启Xcode
最后将framework内的结构调整一下即可
使用的使用直接拖入工程并包含头文件
制作静态库的注意点
无论是 .a 静态库还是 .framework 静态库,最终需要的都是:
二进制文件 + .h + 其它资源文件.a 和 .framework 的使用区别
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用图片资源的处理
如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西
多文件处理
如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件
(一般 主头文件 和 静态库 同名)
在主头文件中包含所有其他需要暴露出来的 .h 文件.framework为什么既是静态库又是动态库
系统的 .framework 是动态库
我们自己建立的 .framework 是静态库静态库中包含了Category
如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)
只要在工程中配置Other Link Flags为-ObjC