1、定义

静态库:

  • 后缀为.a或者.framework的文件
  • 加载过程中,静态库是完全复制到可执行的二进制文件中,被多次使用就会被多次拷贝

动态库:

  • 文件后缀为.tbd.dylib 或者.framework的文件
  • 加载过程是在程序冷启动的时候被链接到内存中,系统只加载一次,多程序共用(eg:UIKit)
  • App内手动打包的动态库,则在App程序内部。

Framework

  • 实际是iOS的一种打包方式,他将二进制文件和头文件等信息聚合在一起。
  • Static Framework
    • 由用户制作的静态库
  • Dynamic Framework (Embedded Framework)
    • 系统提供的framework都是动态库
  • Embedded Framework
    • 用户制作的动态库,本质就是Dynamic Framework,这个命名为了区分取得的别名
    • 受iOS平台限制的动态库
      • 签名机制
      • 沙盒机制
    • 具有部分动态特性
      • 可以在Extension可执行文件和App可执行文件之间共享
      • 需要拷贝到App中,项目目录为Frameworks

历史:

在iOS8之前,iOS平台不支持使用动态库Framework和自定义的动态库,只能支持官方提供的动态库,eg:UIKit.frameworkFoundation.framework等。因为iOS沙盒运行机制,不同程序间不能共享代码,并且苹果也禁止带有动态库的App上架。所以当时只能打包成为静态库.a文件。 在iOS8和xcode 6之后,iOS平台添加了动态库的支持,同时xcode6也原生支持Framework。

2、创建和使用

2.1、创建动态库

在xcode中创建项目,选择Framework即可
image.png
此时已经创建了demo framwork,通过查看build setting中的Mach-O Type可以看到默认是动态库类型
image.png
这里可以修改framework的类型
image.png

  • Executable: 可执行的文件
  • Dynamic Library:动态库
  • Bundle: 资源文件
  • Static Library:静态库
  • Relocatable Object File:可重定位的对象文件
    • 由汇编器生成的.o文件

      2.2、创建静态库

      从xcode模版选择static framework
      image.png
      修改build setting中的Mach-O Type类型为Static Library。这时候静态库就创建好了

2.3、使用

动态库:

  • 将动态库编译famework文件,编译之后,在product文件下可以获得
  • 在General的Embedded Binaries中添加framework文件引用,否则会crash

静态库:

  • 编译生成framework文件,在product文件下获取
  • 将静态库引入到项目文件中即可调用

    3、对比

  • 动态库在xcode中需要配置link,静态库不需要

  • ipa包中,静态库与源代码生成同一个二进制文件,动态库则单独存放在Frameworks中

    4、用途

  • 制作第三方sdk

  • 项目组件化
  • cocapods