iOS静态库和动态库

1,135 阅读2分钟

一. 库

  • 代码共享/保护核心代码
  • 提高编译速度/减少代码体积(系统库一般都是动态库,不重复加载)

静态库

  • .a文件/.framework
  • 编译时拷贝到app中去
  • 所以会增大代码体积/并且不可改变

动态库

  • .dylib/.framework
  • 编译期只存储引用,运行时动态加载到内存
  • 无需拷贝减少体积/因为是运行时加载,所以会有性能损失/安全性

二. 制作和集成

静态库制作

  • 创建 static Library 实现业务逻辑

    image.png
  • 设置需要暴露的头⽂件 如果有新增的头文件,添加到下图位置重新编译下即可

    image.png
  • 选择模拟器或真机分别编译 生成.a文件

    image.png
  • 如果需要合并模拟器/真机静态库

执行lipo -create 模拟器.a 真机.a -output 合并后.a

为了减少包体积,一般都是只打真机库

静态库集成

  • 静态库(.a)本身是二进制文件
  • 需要手动引入二进制文件和头文件 使用双引号形式引入
  • 特殊的库需要设置Other Linker Flags或最低支持版本等

framework制作和集成

framework制作只是一种资源打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

framework制作

  • 创建framework文件 实现业务逻辑

    image.png
  • 设置public的头文件

    image.png
  • 模拟器/真机分别编译(同静态库)

    image.png
  • 如果需要合并模拟器/真机静态库

执行lipo -create 模拟器.a 真机.a -output 合并后.a

framework集成

  • 引入的framework本身包含头文件

  • 设置Embedded Binaries

    image.png
  • 只需引入framework 头文件以尖括号形式引入

    image.png
  • ⼀般需要设置 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可以设置为静态,如下图 图1.png