iOS库

动态库、静态库

920 发布: 2019/12/22 07:05 本文总阅读量

库简介:

库就是程序代码的集合,将N个文件整合起来,实现特定的功能模块儿,从而更好的实现代码共享。本质上是一种可执行文件的二进制格式,可以被载入内存中执行。库可分为开源库和闭源库,开源库比如常用的AFNNetWorking以及SDWebImage,其实现的代码是开放可见的。闭源库比如苹果提供的UIKit等库,只能看见其开放的.h文件,无法查看对应的方法实现部分。iOS中的闭源库又分为静态库动态库

静态库和动态库的区别:

  • 存在形式的区别:

静态库有.a.FrameWork两种形式。
动态库有.tbd.FrameWork两种形式;系统直接提供给我们的.FrameWork都是动态库。

  • .a和.FrameWork的区别:

.FrameWork = .a + .h + bondle(.a为纯二进制文件,需要配合.h文件才能使用,如果其中有用到图片等资源文件的话,需要将资源文件打包成与.a同名的.bondle来配合其使用。在.a中使用.bondle中的资源时需要指明资源所在的bondle,例如使用图片:
[UIImage imageNamed:@“pic” inBundle:<#(nullable NSBundle *)#> compatibleWithTraitCollection:<#(nullable UITraitCollection *)#>])
所以我们在使用库的时候尽量使用.FrameWork的形式比较方便。

  • 静态库的好处:

模块化。便于团队合作开发,提高代码的复用程度以及核心技术的保密性。 避免经常性的少量改动导致大量的重复编译连接。 可以重用,但不是共享使用。

  • 动态库的好处:

减小最终可执行文件的体积,便于团队分工合作,提高代码重用性,便于将应用模块化。 多个程序可以共享内存中同一份库资源,节省内存空间。 可以在不重新编译应用程序的前提下,通过更新动态库的方式来达到更新应用程序功能的目的。 可以使应用插件化。 可以对软件版本进行实时的模块儿更新。

  • 使用机制的区别:

静态库在编译链接时会完整的拷贝一份到可执行文件中去,所以在运行时就不需要原始的库文件了。如果多个app都使用同一个静态库,那么每个app都会拷贝一份静态库文件。所以会比较浪费内存。

动态库不会复制,动态库加载到内存中后在内存中只会存在一份,多个应用可以使用内存中同一份库资源。所以会比较节省内存。由于静态库把编译连接以及绑定的过程放在编译期完成,而动态库则是在运行时统一处理上述过程。所以在动态库初次加载时要比静态库耗时,但是初次加载成功后就不存在这些问题了。

需要注意的是在iOS8之前苹果是不允许第三方框架使用动态库方式实现的,iOS8之后才允许第三方框架使用动态库,但是只能使用苹果提供的CocoTouchFrameWork方式创建,使用CocoTouchFrameWork创建的动态库在打包提交到app的时候会放在app main bundle 根目录下运行在沙盒中并不是在系统中,所以即使是动态库,多个app使用也是要分别打包和签名的,不过在iOS8之后可以使用app extension通过插件的方式来实现动态库的共享。

使用动态库开发的项目不允许在appStore上架,所以如果是企业级的用可以通过动态库实现项目的实时更新。由于动态库的动态更新绕过了苹果的appStore审核机制,所以苹果不允许使用自定义动态库的应用在appStore上线。

iOS中应用代码的编译过程

  • pre-process 预处理:替换宏,删除注释,展开头文件,产生.i文件.
  • compling 编译:将.i文件转换为汇编语言,产生.s文件.
  • assembly 汇编:把汇编文件转换为机器码文件,产生.o文件.
  • link 链接:对.o文件中引用其他库的地方进行引用,生成最后的可执行文件.

动、静态库查验

// 静态库
cd MHBeautySDK.framework
file MHBeautySDK
# 输出
MHBeautySDK: Mach-O universal binary with 2 architectures: [arm64:current ar archivecurrent ar archive] [arm_v7]
MHBeautySDK (for architecture arm64):   current ar archive
MHBeautySDK (for architecture armv7):   current ar archive

// 动态库
cd FaceLandMark.framework
file FaceLandMark  
# 输出        
FaceLandMark: Mach-O universal binary with 2 architectures: [arm_v7:Mach-O dynamically linked shared library arm_v7
- Mach-O dynamically linked shared library arm_v7] [arm64]
FaceLandMark (for architecture armv7):  Mach-O dynamically linked shared library arm_v7
FaceLandMark (for architecture arm64):  Mach-O 64-bit dynamically linked shared library arm64