IOS 创建静态库(.a, .framework) 动态库(.framework, .dylib)

首先,需要知道什么是库?为什么建库?动态库和静态库的区别是什么以及各自的特点?

1. 什么是库啊?

库就是程序代码的集合, 将N个文件组织起来, 是共享程序代码的一种方式

2. 库的分类?

开源库: 源码是公开的, 可以看到每个实现文件 .m 的实现, 例如 Github 上常用的开源库 AFNetworking, SDWebImage 等.

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

3. 静态库的存在形式?

.a .framework

4. 动态库的存在形式?

.dylib .framework

5. 静态库和动态库的区别?

.a 文件肯定是静态库, .dylib 肯定是动态库, .framework 可能是静态库也可能是动态库

静态库在链接时, 会被完整的赋值到可执行文件中, 如果多个APP都使用了同一个静态库, 那么每个APP都会拷贝一份, 缺点是浪费内存, 类似于定义一个基本变量, 使用该基本变量是新复制了一份数据, 而不是原来定义的

动态库不会复制,只有一份, 程序运行时动态加载到内存中, 系统只会加载一次, 多个程序公用一份, 节约了内存. 类似于使用变量的内存地址一样. 使用的是同一个变量,但是项目中如果使用了自己定义的动态库, 苹果是不允许上架的, 在 iOS8 后 苹果开放了动态加载 .dylib 的接口, 用于挂载 .dylib 动态库

6. 静态库的运用场景?

保护自己的核心代码, 如讯飞语音摸索了好多年探索出的结果当然要保存起来, 都公开了公司怎么生存

将MRC的项目打包成静态库, 可以在ARC下直接使用, 不用转换, 如别人使用 MRC 写的开源库, 放到自己的ARC项目中, 需要对每个文件加一个编译参数 -fno-objc-arc 这样相对来说很麻烦, 将整个工程打包成静态库直接放到项目中即可, 也不用对每个文件添加编译选项

7. 静态库的特点?

.a + .h

.a : 可以看做所有 .m 文件加密后的一个二进制文件

.h : 头文件, 用户暴露可用的接口 (方法)

8. 构架是什么?

CPU 构架 是 CPU 厂商给属于同一系列的 CPU 产品定的一个规范, 主要目的是为了区分不同类型 CPU 的重要指示, 模拟器上的构架和真机上的构架不是一样的, 模拟器和模拟器之间, 真机和真机之间的构架也是不同的, 如果静态库的构架和测试项目对应的模拟器或者真机上的构架不对应就会报错 "Undefined symbols for architecture arm64/i386"

查看静态库对应的构架: lipo -info Xxx.a 

静态库都支持哪些构架?
模拟器架构
    iPhone4s ~ 5 : i386
    iPhone5s ~ 7Plus : x86_64
真机架构
    3GS~4s : armv7
    5/5c : armv7s(armv7兼容armv7s)
    5s ~ 6sPlus : arm64

静态库.a的创建过程

1. 新建一个静态库工程(Cocoa Touch Static Library)

创建静态库

2. 工程内会自动生成与工程同名的文件,我在.h文件中定义一个类方法,便于一会测试,在.m中实现类方法打印 “Static Library”。

定义一个类方法

3. 修改下面:如果是YES,说明当前活跃的版本是8,如果只编译此机型,就设置成YES,适配所有的架构Architecture 设置为No。

修改activeArchectureOnly

4. 通过选择模拟器以及Generic ios Device分别Command + B编译后,可以通过Products文件夹中.a的静态库文件show finder找下如下的文件路径。Debug-iphoneos/Debug-iphonesimulator分别代表Debug模式下真机和模拟器的静态库文件。如果在不同的模式下导入错误的静态库会报错的。

生成debug版.a文件

5. 上面事Debug模式下的两种形式,还有release模式的两种形式。可以通过Product -> Scheme -> EditScheme 修改下面的方式更改build模式。

修改release模式

6. 通过修改EditScheme又生成了release模式下的两种静态库形式。

生成release版.a文件

7. 为了方便集成,可以将统一模式下的真机库和模拟器库合并成一个通用的静态库。

lipo -create /所在路径/Release-iphoneos/xxx.a /所在路径/Release-iphonesimulator/xxx.a  -output 目标路径/xxx.a
这样,就可以合并成一个通用的静态库,唯一的缺点是体积要大一点相对于真机和模拟器两个的总大小 之后将这个静态库拖到工程中即可
合并生成通用的.a文件

8. 将生成的通用静态库替换原静态库,并且将静态库和include文件夹一同拖入项目中。

将通用的.a文件和include文件夹拖到项目中

9. 拖入到项目中需要勾选的选项。

拖到项目中

10. 引入头文件 + 调用 + 打印

引入头文件使用

以上就是静态库.a的创建以及使用过程。下面就来创建.framework库。

1.新建.framework库工程

新建.framework库

2.通过此处修改.framework是动态库还是静态库

修改.framework是动态还是静态

3. 新建文件,添加测试代码

创建文件

4. 将需要暴露的头文件导入.h文件

导入头文件

5. 设置header,将需要暴露的头文件放在public下面,隐藏在project或者private下面无法被引用。

暴露头文件

6. 同上述创建.a库操作一样,通过选择模拟器以及Generic ios Device分别Command + B编译后,可以通过Products文件夹中.framework的静态库文件show finder找下如下的文件路径。通过终端指令将Debug-iphoneos和Debug-iphonesimulator下的xxx.framework/xxx合并成通用framework。然后将通用的framework替换原framework。最后将替换完成的xxx.framework拖入到项目中。

生成.framework库

7. 引入头文件 + 调用 + 打印

.framework库的使用

以上就是.a / .framework库的创建到使用过程。如果有任何不正确的地方还请指点!!!

参考: iOS 静态库(.a, .framework) 动态库(.framework, dylib)

你可能感兴趣的:(IOS 创建静态库(.a, .framework) 动态库(.framework, .dylib))