首先讲讲什么是库?库是程序代码的集合,是共享程序代码的一种方式。
我们在平时的iOS开发当中免不了要用到各种第三方库,比如常用的SDWebImage、AFNetworking,当然这些属于是开源库,源代码是公开的,能看到具体的实现过程。还有一种库叫做闭源库,这类库不公开源代码,它们是经过编译后的二进制文件,看不到具体的实现,这类库又细分为静态库和动态库。静态库在链接时会被完整地复制到可执行文件中,被多次使用就会有多次冗余拷贝,而动态库在链接时不需要复制,程序运行时由系统动态加载到内存,供程序调用,系统只会加载一次,然后多个程序共用,从而达到节省内存的目的。
一. 制作.a库
1. 创建一个新工程,选择Framework & Library下面的Cocoa Touch Static Library
2. 输入静态库名称,点击下一步,选择要保存的位置
3. 把你要封装的类拖进来, 注意:当你的静态库中用到自定义的控件或者分类时候,你会发现,导入静态库的时候,你的工程会报错。 解决办法:Build Setting—>Other Linker Flags 选项添加:-all_load 或者 -ObjC
4. 设置对应的参数,点击Build Setting,将
Build Active Architecture Only
设置为NO,
Build Active Architecture Only
设置为YES
时,是为了debug
的时候编译速度更快,此时它只编译当前的architecture
版本。设置为NO
时,会编译所有版本。
5. 接下来分别使用模拟器和真机进行编译,生成模拟器和真机对应的Debug
和Release版本
的静态库。 选择任意一个模拟器,然后按住command+option+R, 分别修改Run为Debug和Release,command+R进行编译,生成对应版本的.a, 真机的话选择Generic iOS Device
6. 编译成功之后,直接点击静态库,Show In Finder
,就显示出你的静态库所在路径。此时,你会发现,已经生成了Debug
和Release
版本下模拟器和真机类型的.a
静态库。
7. 为了更方便的使用.a静态库,下面我们分别对Debug版本下的真机和模拟器类型的.a和Release
版本下的真机和模拟器类型的.a进行合并,合并方式为:打开终端,输入lipo -create 静态库1的路径 静态库2的路径 -output 要生成的静态库路径+静态库名称
8. 合并好之后,通过 lipo -info 静态库路径 查看静态库支持的设备类型
二. 使用.a
直接把生成的.a库拖到Xcode
里面来,然后在Bulid Phases-->Link Binary With Libraries里面添加你的库
注意把头文件也导进来,不然你没法用。
三. 制作.framework
虽然.a库不会暴露你的代码实现部分,但需要你一并公布所有的公开的头文件,稍微有点麻烦。你需要一种简单的方法来编译你的代码,这种方法使得你的代码容易分享,并且可以在多个工程中复用,这就需要制作framework了。需要注意的是,framework有两种形式,系统提供的framework是动态库,而我们自己创建的framework是静态库。
1. 新建工程,选择“Framework & Library”下的Cocoa Touch Framework,点击下一步。
2. 输入项目名称,回车,创建好之后的工程目录结构如下图所示:
3. 创建你要的类,这里我创建一个弹框类WYFShowToast,在.m里面实现具体的方法,再创建一个WYFCommonTools工具类,在.h里面提供显示弹框的方法
4. 更改参数,在TARGETS下选中工程,点击Build Settings,修改Dead Code Stripping为No,Link With Standard Libraries为No,Mach-O Type选择Static Library
5. 在Architectures下增加armv7s(iPhone 5和5c使用了此架构)并选中,将Build Active Architecture Only 设置为No
6. 关键的一步,选中Build Phases下的Headers,把你需要公开的头文件拖至Public下,需要隐藏的头文件放在Private或者Project下
7. 选中任一模拟器,command+R编译,然后再选中Generic iOS Device进行编译,编译后获得Debug-iphoneos(真机)Debug-iphonesimulator(模拟器)下的两个MyFramework,通过终端命令 lipo -create 将两个framework进行合并,我这边把它放到了桌面,名字叫MyFramework.lipo,然后去掉.lipo,并替换MyFramework文件夹下的MyFramework,至此,framework制作完毕!
四. 使用.framework
将制作好的framework导入到另一个工程中,展开这个framework可以看到,其中一个是我们之前添加的MyFramework.h文件,另一个就是我们的WYFCommonTools.h,然后在用到的地方导入#import <MyFramework/MyFramework.h>
比如我在下面这个地方用到了我制作的framework,导入头文件后直接调用方法,这个方法是要显示一个提示框
果然,方法如期实现:
以上就是iOS静态库和动态库的制作和使用,如有不对的地方请给我留言,我会及时改进的,谢谢大家!!