lufei's Studio.

iOS中的库----初识

字数统计: 823阅读时长: 2 min
2017/02/27 Share

前言

做iOS的过程中会引用一些三方库,而这些库,有的是.a,有的是.framework,有的是.dylib,有的是.tbd,说实话,我还是比较晕的,做个笔记,方便记忆QAQ。

静态库和动态库

静态库(.a)和动态库(.dylib)都是编译好的二进制文件,区别在于用法

  1. 对于一个静态库而言,其实已经是编译好的了,类似一个 .o 的集合。在 build 的过程中只会参与链接的过程,而这个链接的过程简单的讲就是合并,并且链接器只会将静态库中被使用的部分合并到可执行文件中去,在编译链接的时候,会将静态库的所有文件都添加到目标 app 可执行文件中,并在程序运行之后,静态库与 app 可执行文件 一起被加载到同一块代码区中。

  2. 对于动态库而言,其实分 动态链接库动态加载库 两种的,这两个最本质的区别还是加载时间。

动态链接库:在没有被加载到内存的前提下,当可执行文件被加载,动态库也随着被加载到内存中。
动态加载库:当需要的时候再使用 dlopen 等通过代码或者命令的方式来加载。

但是不论是哪种动态库,相比较与静态库,动态库处理起来要棘手的多。由于动态库是动态的,所以你事先不知道某个函数的具体地址。因此动态链接器在链接函数的时候需要做大量的工作。

不管是静态库、动态库,两者的区别和在内存哪个区域没有关系,最本质的区别是,一个的函数调用在编译的时候就已经确定,而动态库是动态加载的。换句话说,静态库修改了东西,整个程序需要重新编译,而对于动态库的修改而言,只需要重启 app(重置 PLT )

注:

Mac下,.a文件指静态库,.dylib指动态库,.tbd其实是一个YAML文件,描述了需要链接的动态库的信息。主要目的是为了减少app 的下载大小,在xcode7以后用来取代.dylib。为了更方便的使用动态库和静态库(一般情况下,使用.a或者使用.tbd,都要配合资源文件和头文件使用),所以我理解下来,『.framework = .a/.tbd + .h + bundle』

最后

其实关于Xcode怎么创建**.framework**,网上有很多教程,就不多说了,这篇文章都是参考了网上别人的说法,为了方便记忆和理解,才记录下来的,其实说到动态库和静态库的优缺点,说法很多,至于怎么选择,还是看具体项目比较合适,目前我的认识还很浅,如果有更好的理解了,再来更新,mark!!!QAQ

拓展

说到.a文件,关于.a文件的多平台支持,还是需要研究一下的,这里先记录下了,armv7i386x86_64arm64,还有动态库实现app的热修复(继续学习,我猜想JSPatch的思路应该是这样的)。

CATALOG
  1. 1. 前言
  2. 2. 静态库和动态库
  3. 3. 注:
  4. 4. 最后
  5. 5. 拓展