前言:
动态库和静态库对于我们使用静态语言开发的开发者已经见的很多了,然而我们对于它们的认识还不够,觉得他们很神秘,下面就让我们一起来揭开它们神奇的面纱吧!😊
一、动态库和静态库的格式一般是什么?
1.静态库: 后缀为.a和.framework
2.动态库: 后缀为.framework(系统提供我们的.framework都是动态库)和.dylib(Xcode7之前)和.tbd(Xcode7之后,基于文本的存根库,库更小)
二、那么我们为什么要制作静态库和动态库?
1.为了提高编译速度,因为静态库和动态库是由可执行代码的二进制格式组成,可以被载入内存中执行。
2.模块化,可分工合作,适合团队开发。
3.可以重用。
4.静态库链接时完整的拷贝到可执行文件中,编译后的执行程序不需要外部函数支持。
5.动态库链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,可以将最终的可执行文件的体积缩小,多个程序可共享内存中的同一份文件,节省资源,也可以在不重新编译可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
6.静态库和动态库都是闭源库,不会暴露内部的具体信息。
三、.a文件和.framework文件的区别是什么?
1..a文件是一个纯二进制文件。使用的时候需要配合头文件.h和资源文件Resource使用。
2..framework文件除了有二进制文件,还有头文件和资源文件,可以直接使用(一般建议做成.framework格式的)。
四、静态库和动态库的不足之处是什么?
1.静态库因为在链接时,会完整的拷贝到可执行文件中,所以如果多次使用静态函数库编译,就会使文件变得越来越大。还有就是因为所有函数都被编译进去了,所以如果静态库改变了,那么你就需要重新编译。
2.动态库因为可实现自动更新,所以与AppStore的审核机制冲突,iOS8.0之前所有包含自定义动态库.framework的App都是无法在AppStore上架的,iOS8.0以后,苹果支持创建Embed Frameworks,可以嵌套动态库到App中使用,这点不足也就没有了,但是Embed Frameworks被限制在了一个进程中,不是真正的动态库了,如果开发的是企业级应用,可以随意使用。