库的概念及制作

一、 什么是库?

库是程序代码的集合,是共享程序代码的一种方式。根据源代码的公开情况,库可以分为两种类型:

1. 开源库,公开源代码,能看到具体实现,比如:SDWebImage、AFNetworking。

2. 闭源库,不公开源代码,是经过编译后的二进制文件,看不到具体实现。闭源库主要分为:静态库和动态库。

二、静态库和动态库的存在形式

1. 静态库:    .a 和 .framework

2. 动态库:    .dylib 和 .framework

三、静态库和动态库在使用上的区别

静态库:链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多分冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序公用,节省内存。

静态库与动态库的分配大致如下:

库的概念及制作_第1张图片

四、制作静态库

本例就以MJRefresh框架为例,制作 .a 静态库。MJRefresh代码结构如下:

库的概念及制作_第2张图片

1. 新建 "Framework & Library" 项目。

库的概念及制作_第3张图片

2. 命名静态库名称

库的概念及制作_第4张图片

3. 删除默认生成的文件

库的概念及制作_第5张图片

4. 导入需要生成静态库的文件

库的概念及制作_第6张图片

5. 在Build Phases 中点击左边的 "+", 选择 "New Headers Phase" ,选择需要暴露给用户的头文件

库的概念及制作_第7张图片

6. 选择之后,将暴露的头文件拖拽到 Public下面。

库的概念及制作_第8张图片


7. 分别对真机和模拟器进行编译,编译成功之后,静态库就会变色,表示编译成功了。 编译前后对比如下:

库的概念及制作_第9张图片    库的概念及制作_第10张图片

然后,我们右击静态文件,会发现有两个,一个是给真机使用的,一个是个模拟器使用的。

库的概念及制作_第11张图片

8. 如果觉得麻烦的话,我们可以将这两个文件进行合并。在终端敲入一下命令

库的概念及制作_第12张图片

最终会在Products文件夹下面生成一个 libMJRefresh.a 文件,它就是真机与模拟器静态文件合并后的结果。

9. 将合并好的静态文件以及库所需要的头文件和资源文件放在一起,这就是我们所需要的静态库。

库的概念及制作_第13张图片

10. 静态库的使用

新建一个测试项目,导入刚才生成的静态库,写入以下测试代码:

库的概念及制作_第14张图片


尝试调用静态库中的addFooterWithCallback 这个方法进行上拉刷新操作,但是运行的时候报错! 说addFooterWithCallback这个方法找不到。但是源文件中明明有这个方法的声明与实现!!! 原因是刚刚生成的静态库中有分类文件,编译器发现有分类文件的话,就不会链接这些分类文件,导致最终的运行报错。解决的办法就是加一个链接参数,告诉编译器,所有的文件都链接进来。注意链接参数的大小写!

库的概念及制作_第15张图片


运行代码,一切OK了。


你可能感兴趣的:(静态库,库,.a文件,静态库的制作)