静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。
静态库 好处:
i.模块化,分工合作,提高了代码的复用及核心技术的保密程度
ii.避免少量改动经常导致大量的重复编译连接
iii.也可以重用,注意不是共享使用
动态库 好处:
i.使用动态库,可以将最终可执行文件体积缩小,将整个应用程序分模块,团队合作,进行分工,影响比较小
ii.使用动态库,多个应用程序共享内存中得同一份库文件,节省资源
iii.使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
静态库存在的形式
- .a
- .framework
动态库的存在形式
- .dylib
- .framework
静态库和动态库的区别
- .a文件肯定是静态库,.dylib肯定是动态库,.framework可能是静态库也可能是动态库;
- 静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
- 动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
- 但是项目中如果使用了自己定义的动态库,苹果是不允许上架的,在iOS8.0以后苹果开放了动态加载.dylib的接口,用于挂载.dylib动态库
静态库的运用场景
- 保护自己的核心代码,如讯飞语言摸索了好多年探索出的结果当然要保护起来了,都公开了公司还怎么生存。
- 将MRC的项目打包成静态库,可以在ARC下直接使用,不用转换。如别人使用MRC写的开源库,放到自己ARC项目中,需要对每个文件加一个编译参数 -fno-objc-arc,这样相对来说麻烦,将整个工程打包成静态库直接放到项目中即可,也不用对每个文件添加编译选项。
静态库的特点
.a + .h
.a : 可以看做所有.m文件加密后的一个二进制文件
.h : 头文件用户暴漏可用的接口(方法)