iOS中的动态库,静态库和framework介绍

4,385 阅读3分钟

1、什么是库

首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。

什么时候我们会用到库呢?

  1. 一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。 (一些引入的第三方库)
  2. 对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。 (一些比较稳定的工具类,或者很稳定的功能模块)

2、概念介绍

动态库,静态库,framework 其实不是一个维度上。

1、framework

framework并不是库,它只是一种打包方式,它既可以是动态库也可以是静态库。将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发,和静态库动态库的本质是没有什么关系。

2、静态库

静态库 (静态链接库) 以.a 和 .framework 结尾 。 只所以叫静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在程序里就不会在改变

优点:编译完成之后,库文件没有作用了,目标没有外部依赖,直接可以运行

缺点: 会是目标体积增大

3、动态库

动态库(动态链接库) 以 .dylib 或者 .framework 后缀结尾 与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。

优点:不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,运行时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。

缺点: 动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux 下喜闻乐见的 lib not found 错误)。

3 ios 常见的几种库

系统动态库 Dynamic Framework

系统提供的 framework 都是动态库,比如 UIKit.framework,具有所有动态库的特性。

用户动态库 Embedded Framework

用户可以制作的“动态库”,它是受到 iOS 平台限制(签名机制和沙盒机制限制)的动态库,它具有部分动态特性,比如:

  • Embedded Framework 可以在 Extension可执行文件 和 APP可执行文件 之间共享,但是不能像系统的动态库一样,在不同的 APP(进程) 中共享
  • 系统的 Framework 不需要拷贝到目标程序中,Embedded Framework 最后也还是要拷贝到 APP 中.

静态库 tatic Framework

Static Framework,静态库,用户可以制作,可以粗略的理解为,它等价于 头文件 + 资源文件 + 二进制代码,它具有静态库的属性。

静态库就是我们组件化中常见的工具库

ios中的动态库,静态库 ios制作静态库