iOS-动态库、静态库

编译

将人类可读的程序代码文本 --> 翻译成为 --> 计算机可以执行的二进制指令。
即:源程序 --> 翻译成为 --> 目标程序


1、什么是库?

所谓库就是程序代码的集合,是共享程序代码的一种方式。

2、库的分类

根据程序代码的开源情况,库可以分为两类

  • 「开源库」:源代码是公开的,你可以看到具体实现。GitHub上比较出名的第三方框架AFNetworking、SDWebImage、YYKit。
  • 「闭源库」: 不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库和动态库。

3、静态库和动态库的存在形式和使用区别

3.1、存在形式:

  • 静态库 以".a"或者“.framework”为文件后缀名 (windows: .lib , linux: .a)
  • 动态库 以".dylib"或者“.framework”为文件后缀名(Xcode7 之后 .tbd 代替了 .dylib)
  • (自己打包的framework是静态库「也可以是动态库,只不过不能上架」;系统提供给我们的framework都是动态库!)(windows:.dll , linux: .so)

3.2、使用区别:

  • 静态库:是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,会被完整的复制到生成的可执行文件中,被多次使用就有多份拷贝。

优点:编译后即可使用,执行程序不需要外部函数库的支持,模块化,分工合作,代码反复使用,使用效率高。

缺点:如果静态函数库改变了,那么程序必须重新编译;被多次使用就会有多份冗余拷贝。

  • 动态库:动态库又称动态链接库英文为DLL,是Dynamic Link Library,不是可执行文件。动态链接提供了一种方法,使进程可以调用其中的可执行代码的函数。链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。其实动态库应该叫共享库。
优点:
  • 可以将最终可执行文件体积缩小。
  • 多个应用程序共享内存中得同一份库文件,节省资源
  • 可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
  • 将整个应用程序分模块,团队合作,进行分工,影响比较小。
缺点:

程序运行时动态的申请并调用,使用效率低。

3.3 .a文件和.framework文件的区别?

  • .a是一个纯二进制文件,不能直接拿来使用,需要配合头文件、资源文件一起使用。
  • 将静态库打包的时候,只能打包代码文件;图片、json文件和xib等资源文件无法打包进去, 使用.a静态库的时候需要三个组成部分:.a文件+需要暴露的头文件+资源文件bundle;
  • .framework中除了有二进制文件之外还有资源文件,可以拿来直接使用。

------------------------------注意------------------------------

引用
iOS 使用动态库
iOS动态库热更新
iOS 使用 Xcode8 制作动态库
iOS制作动态库



出于苹果的审核机制,现在极少有使用热更新开发的APP,在项目中也使用极少。出于对热更新的好奇,写了一个热更新的demo。如果你的项目不需要上架审核则可以使用热更新来更新APP。

苹果的热更新方案有许多种,这里使用的是苹果原始的Dynamic Library热更新。

动态库更新主要分为两部分:1、创建动态库;2、APP加载动态库。

这个方法为iOS原生的热更新方案实现方法,由于在iOS10之后的系统已经禁止将动态库放在沙盒中加载,如果需要使用热更新,此方法则不可用,可以在模拟器上测试使用,说不定以后苹果开放了热更新就又可以用了。在现有阶段除了系统提供的动态库的热更新,其他也有许多方案,但苹果审核一般比较难以通过,所以不建议使用。


引用参考:

  • iOS打包静态库(完整篇)
  • 制作iOS SDK接入到Untiy游戏项目
  • Unity接入iOS SDK没有你想的那么难
  • iOS静态库和动态库的区别
  • iOSFramework制作过程:2021.01
  • 使用Cocoapods创建SDK,并生成Framework
  • iOS手把手创建framework与资源使用 -2019.07.15 老版本

你可能感兴趣的:(iOS-动态库、静态库)