静态库和动态库

什么是库?

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

开源库

  • 公开源代码,能看到具体实现。

  • 比如一些开源库:SDWebImage、AFNetworking

闭源库

  • 不公开源代码,是经过编译后的二进制文件,看不到具体实现。

  • 主要分为:静态库、动态库。

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

  • 静态库:**.a** 和 .framework
  • 动态库:**.dylib** 和 .framework

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

  • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。
  • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

CPU 架构

  • 每一个设备都有属于自己的 CPU 架构。
  • 每一个静态支持的架构是固定的。
  • 查看静态库支持的架构:lipo -info xxxx.a
  • 模拟器 CPU 架构:i386x86_64
  • 真机 CPU 架构:armv7armv7s(静态库只要支持了 armv7,就可以跑在 armv7s 的架构上)、arm64

支持所有架构的编译方法

TARGETSBuild SettingsArchitectureBuild Action Architecture only → 全部选择NO

为什么要做静态库?

  • 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用”闭源”的方式开发使用
    例如:百度地图,友盟,JPush等。
  • 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,也会提供静态库给程序员使用。

静态库文件的版本(4种)

  1. 真机-Debug版本

  2. 真机-Release版本

  3. 模拟器-Debug版本

  4. 模拟器-Release版本

调试版本 VS 发布版本

  • 调试版本会包含完整的符号信息,以方便调试。

  • 调试版本不会对代码进行优化。

  • 发布版本不会包含完整的符号信息。

  • 发布版本的执行代码是进行过优化的。

  • 发布版本的大小会比调试版本的略小。

  • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升。

静态库的合并

1
2
3
4
5
6
7
8
9
# 检测.a的架构类型
$ lipo -info libCZTools.a

# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

# 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本