编译
将人类可读的程序代码文本 --> 翻译成为 --> 计算机可以执行的二进制指令。
即:源程序 --> 翻译成为 --> 目标程序
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中除了有二进制文件之外还有资源文件,可以拿来直接使用。
------------------------------注意------------------------------
出于苹果的审核机制,现在极少有使用热更新开发的APP,在项目中也使用极少。出于对热更新的好奇,写了一个热更新的demo。如果你的项目不需要上架审核则可以使用热更新来更新APP。
苹果的热更新方案有许多种,这里使用的是苹果原始的Dynamic Library热更新。
动态库更新主要分为两部分:1、创建动态库;2、APP加载动态库。
这个方法为iOS原生的热更新方案实现方法,由于在iOS10之后的系统已经禁止将动态库放在沙盒中加载,如果需要使用热更新,此方法则不可用,可以在模拟器上测试使用,说不定以后苹果开放了热更新就又可以用了。在现有阶段除了系统提供的动态库的热更新,其他也有许多方案,但苹果审核一般比较难以通过,所以不建议使用。
引用参考: