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.framework
、Foundation.framework
等。因为iOS沙盒运行机制,不同程序间不能共享代码,并且苹果也禁止带有动态库的App上架。所以当时只能打包成为静态库.a
文件。 在iOS8和xcode 6之后,iOS平台添加了动态库的支持,同时xcode6也原生支持Framework。
2、创建和使用
2.1、创建动态库
在xcode中创建项目,选择Framework即可
此时已经创建了demo framwork,通过查看build setting中的Mach-O Type可以看到默认是动态库类型
这里可以修改framework的类型
- Executable: 可执行的文件
- Dynamic Library:动态库
- Bundle: 资源文件
- Static Library:静态库
- Relocatable Object File:可重定位的对象文件
2.3、使用
动态库:
- 将动态库编译famework文件,编译之后,在product文件下可以获得
- 在General的Embedded Binaries中添加framework文件引用,否则会crash
静态库: