iOS 静态库和动态库

库的概念

就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式。库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

库的分类

开源库:源代码是公开的,可以看到每个实现文件(.m文件)的实现,例如GitHub上的常用的开源库:AFNetworking、SDWebImage等;

闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体的实现。闭源库又分为:静态库 和 动态库

动态库与静态库

静态库:以.a 和 .framework为文件后缀名

动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名

iOS中静态库与动态库本质上的区别是相对于编译期与运行期而言的,静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库,而动态库在程序编译时不会链接到目标代码中,只是在程序运行时才载入 我们所添加的动态库与静态库都存在于Build Phases Link Binary With Libraries中:

png1

使用静态库最大好处是避免了少量的改动经常导致大量的重复的编译链接,提高了代码的复用及核心技术的保密程度,而使用动态库最大的好处为体积小,多个应用程序共享内存中得同一份库文件,节省资源,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的

iOS8之后苹果允许开发者有条件的创建和使用动态库的框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 framework 不同,app 中使用 Cocoa Touch Framework制作的动态库 在打包和提交 app 时会被放到 app main bundle 的根目录中,运行在沙盒里,而不是系统中

不过要注意的是虽然苹果开放了自定义framework动态库,但是由于动态库具有动态更新的功能,这与apple store的审核制度相冲突,所以含有自定义的framework的app可能无法在商店上架的(有些开发者使用framework可以上架)

Mach-o

png1

Mach-oMach Object文件格式的缩写,它是一种用于可执行文件,目标代码,动态库,内核转储的文件格式。作为a.out格式的替代,Mach-o提供了更强的扩展性,并提升了符号表中信息的访问速度。

注意在制作framework的时候需要选择这个 Mach-O Typestatic为静态,Dynamic为动态