首先讲讲什么是库?库是程序代码的集合,是共享程序代码的一种方式。

  我们在平时的iOS开发当中免不了要用到各种第三方库,比如常用的SDWebImage、AFNetworking,当然这些属于是开源库,源代码是公开的,能看到具体的实现过程。还有一种库叫做闭源库,这类库不公开源代码,它们是经过编译后的二进制文件,看不到具体的实现,这类库又细分为静态库和动态库。静态库在链接时会被完整地复制到可执行文件中,被多次使用就会有多次冗余拷贝,而动态库在链接时不需要复制,程序运行时由系统动态加载到内存,供程序调用,系统只会加载一次,然后多个程序共用,从而达到节省内存的目的。

iOS动态库引入静态库 ios app启动动态库和静态库_iOS动态库引入静态库

一. 制作.a库

1. 创建一个新工程,选择Framework & Library下面的Cocoa Touch Static Library

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS_02

 

2. 输入静态库名称,点击下一步,选择要保存的位置

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS动态库引入静态库_03

 

3. 把你要封装的类拖进来, 注意:当你的静态库中用到自定义的控件或者分类时候,你会发现,导入静态库的时候,你的工程会报错。 解决办法:Build Setting—>Other Linker Flags 选项添加:-all_load 或者 -ObjC

 

iOS动态库引入静态库 ios app启动动态库和静态库_头文件_04

 

 4. 设置对应的参数,点击Build Setting,将Build Active Architecture Only设置为NO,Build Active Architecture Only设置为YES时,是为了debug的时候编译速度更快,此时它只编译当前的architecture版本。设置为NO时,会编译所有版本。

 

 

5. 接下来分别使用模拟器和真机进行编译,生成模拟器和真机对应的DebugRelease版本的静态库。 选择任意一个模拟器,然后按住command+option+R, 分别修改Run为Debug和Release,command+R进行编译,生成对应版本的.a, 真机的话选择Generic iOS Device

 

iOS动态库引入静态库 ios app启动动态库和静态库_头文件_05

 

 6. 编译成功之后,直接点击静态库,Show In Finder,就显示出你的静态库所在路径。此时,你会发现,已经生成了DebugRelease版本下模拟器和真机类型的.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里面提供显示弹框的方法

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS_06

 

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下

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS_07

 

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>

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS动态库引入静态库_08

 

比如我在下面这个地方用到了我制作的framework,导入头文件后直接调用方法,这个方法是要显示一个提示框

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS动态库引入静态库_09

 

果然,方法如期实现:

 

 

iOS动态库引入静态库 ios app启动动态库和静态库_iOS_10

 

以上就是iOS静态库和动态库的制作和使用,如有不对的地方请给我留言,我会及时改进的,谢谢大家!!