背景
每次编译的时候,那漫长的编译过程都有让人想做编译优化的冲动,然而要怎么做,却一头雾水,这几天看了项目里的编译优化、有很多都是将代码打成了二进制文件,从而实现了编译速度的提升。今天就和大家聊一下这个问题。
基础
库的概念
所谓库就是把一堆代码打包,然后只暴露给外边一些头文件供使用,其内部的实现不能被看到或者修改。
而库有两种:静态库和动态库
静态库
静态库就是把.m编译链接后生成的一些.o文件和一些其他需要的东西放在一起当作一个整体
常见的形式:
.a和.framework
.a文件相当于我们只把.o文件放在一起打包了一下,就相当于造好了一个黑盒,但是还缺少一个告诉外界它的输入输出是什么的说明书,而这个说明书就是.h文件,所以.a一般还需要在使用的时候,将需要告诉外界的.h文件一起放入。
.framework文件相当于我们把所有需要的东西都放在了一起,然后给外界直接可以使用。
优点
因为静态库是已经编译好的文件,所以在编译的时候就不需要再对这一部分内容进行编译所以会提升编译速度
缺点
静态库使用的时候需要拷贝一份到App内。所以会使得App的体积变大。
动态库
动态库也是多个.o文件组合起来的,
常见的形式:
.dylib和.framework
.dylib是mac上非常常见的文件,比如你到/usr/lib或者直接全局搜索.dylib都可以看到很多这样的文件
.framework: 动态链接库,这个直接上图:
看了上图是不是一目了然,日常开发用的基础库都是动态库
优点
同样动态库也已经编译好,所以在编译的时候就不需要再对这一部分内容进行编译,比如,你编译工程的时候从来没让你编译一次UIKit吧。
动态库不需要拷贝至APP中,可执行文件只会存储指向动态库的引用。
缺点
因为动态库没有拷贝一份到App内。所以在启动 app 时需要立刻将动态库进行加载,那么这个过程就是一个耗时的操作。
库的使用
前边聊到库是不需要在使用的时候再次编译的,那么有同学就想问了,把app的所有东西都打成库,是不是编译时长就是0了。这个想法倒是没错,但是问题在于都是库的话,你的APP不就相当于固定了,要知道库的内容是不能在使用的时候更改的。所以我们来聊一下如何更好的使用库
建议使用的场景
降低编译时间
从编译时长来说,肯定是打包成库的代码越多,编译时间越短,因为这意味着我们需要编译的内容更少了,每次运行需要等待的时间就会更短。
增加代码安全性和模块化
打包成库的代码在使用的时候一眼就能看出来这些代码属于一个独立的模块,同时能够打包成一个库,意味着我们的这部分代码同其它部分是解耦的,同时使用者还不能够修改这部分内容的实现,增加了代码的安全性。
不建议使用的场景
开发中代码需要频繁改动
频繁改动的代码如果打包成库,意味着每次改动后都需要单独对这一部分的内容重新编译,然后重新导入到需要使用的工程里,反复的枯燥劳动使人沮丧。
需要限制APP的大小
虽然有动态库,但是,我们日常使用的自己代码打包成的库都只能是一些静态的库,因为我们开发的代码都只适合自己的业务场景,而不是为所有的mac而做的基础工程,苹果是不会给这样的库放到动态库文件里的,所以我们自己开发的哭都会用 Embedding Frameworks 的方式来使用这会导致我们需要在编译时把库全部拷贝到 app, 然后在 app 启动时全部加载, 这样的话会导致APP体积增大, 加载速度慢。