编译
将人类可读的程序代码文本 --> 翻译成为 --> 计算机可以执行的二进制指令。
即:源程序 --> 翻译成为 --> 目标程序
库的分类
根据程序代码的开源情况,库可以分为两类
- 「开源库」:源代码是公开的,你可以看到具体实现。GitHub上比较出名的第三方框架AFNetworking、SDWebImage、YYKit。
- 「闭源库」: 不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库 和 动态库。
静态库和动态库的区别
1. 链接方式
静态库:在编译时链接到目标程序中,成为可执行文件的一部分。每个使用静态库的程序都会包含一份库的副本。
动态库:在运行时链接,多个程序可以共享同一个动态库,无需在每个程序中重复包含。
2. 文件格式
静态库:通常以.a或.framework(包含二进制文件和资源)形式存在。
动态库:通常以.dylib或.framework形式存在。
3. 内存占用
静态库:每个程序都包含库的副本,增加内存占用。
动态库:多个程序共享同一份库,减少内存占用。
4. 更新和维护
静态库:更新库需要重新编译整个程序。
动态库:更新库只需替换库文件,无需重新编译程序。
5. 加载时间
静态库:在程序启动时加载,可能增加启动时间。
动态库:在运行时加载,启动时间较短,但运行时可能会有延迟。
6. 兼容性
静态库:兼容性较好,因为库代码直接嵌入程序中。
动态库:需确保库版本与程序兼容,否则可能引发运行时错误。
7. iOS中的限制
静态库:iOS广泛支持静态库。
动态库:iOS对动态库的使用有较多限制,开发者通常使用系统提供的动态库。
总结:
静态库:适合小型项目或需要独立部署的场景。
动态库:适合大型项目或多个应用共享代码的场景。
App Store:不允许使用自定义动态库,能使用静态库。
非App Store分发:如企业分发或Test Flight,可以使用自定义动态库。
使用区别:
优点:编译后即可使用,执行程序不需要外部函数库的支持,模块化,分工合作,代码反复使用,使用效率高。
缺点:如果静态函数库改变了,那么程序必须重新编译;被多次使用就会有多份冗余拷贝。
- 动态库:动态库又称动态链接库英文为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之后的系统已经禁止将动态库放在沙盒中加载,如果需要使用热更新,此方法则不可用,可以在模拟器上测试使用,说不定以后苹果开放了热更新就又可以用了。在现有阶段除了系统提供的动态库的热更新,其他也有许多方案,但苹果审核一般比较难以通过,所以不建议使用。
引用参考: