一. 库
- 代码共享/保护核心代码
- 提高编译速度/减少代码体积(系统库一般都是动态库,不重复加载)
静态库
- .a文件/.framework
- 编译时拷贝到app中去
- 所以会增大代码体积/并且不可改变
动态库
- .dylib/.framework
- 编译期只存储引用,运行时动态加载到内存
- 无需拷贝减少体积/因为是运行时加载,所以会有性能损失/安全性
二. 制作和集成
静态库制作
-
创建 static Library 实现业务逻辑
-
设置需要暴露的头⽂件 如果有新增的头文件,添加到下图位置重新编译下即可
-
选择模拟器或真机分别编译 生成.a文件
-
如果需要合并模拟器/真机静态库
执行lipo -create 模拟器.a 真机.a -output 合并后.a
为了减少包体积,一般都是只打真机库
静态库集成
- 静态库(.a)本身是二进制文件
- 需要手动引入二进制文件和头文件 使用双引号形式引入
- 特殊的库需要设置Other Linker Flags或最低支持版本等
framework制作和集成
framework制作只是一种资源打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。
framework制作
-
创建framework文件 实现业务逻辑
-
设置public的头文件
-
模拟器/真机分别编译(同静态库)
-
如果需要合并模拟器/真机静态库
执行lipo -create 模拟器.a 真机.a -output 合并后.a
framework集成
-
引入的framework本身包含头文件
-
设置Embedded Binaries
-
只需引入framework 头文件以尖括号形式引入
-
⼀般需要设置 Other Linker Flags 等
三. 其他
-
iOS 8/Xcode 6 要添加了自己创建framework动态库的支持,一说是 Extension 的出现。Extension 和 App 是两个分开的可执行文件,同时需要共享代码,这种情况下动态库的支持就是必不可少的了。但是这种动态 Framework 和系统的 UIKit.Framework 还是有很大区别。系统的 Framework 不需要拷贝到目标程序中,我们自己做出来的 Framework 哪怕是动态的,最后也还是要拷贝到 App 中(App 和 Extension 的 Bundle 是共享的),因此苹果又把这种 Framework 称为Embedded Framework。
-
自己制作的framework 通过Mach-O可以设置为静态,如下图