在本文中,你将了解到如下内容:
PCH
是什么?
PCH
(Precompile Prefix Header File)文件,也就是预编译头文件,这个文件里的内容能够被项目中所有的源文件访问到。
我们通常会在将一些通用的宏定义和头文件放在PCH
中,这样会方便我们的代码编写,提高效率。
为项目添加PCH
- 首先需要创建一个后缀为
.pch
的文件,也就是我们的PCH
文件。 - 在
Build Settings
中搜索prefix header
,筛选出需要设置环境变量。 - 为
Prefix Header
设置之前创建的PCH
文件的路径。 - 再设置
Precompile Prefix Header
为YES
。
操作图示如下:
其实在完成上面的第3步之后,这个PCH
文件就能供项目中的所有文件访问了。设置Precompile Prefix Header
为YES
就是为了预编译PCH
文件。
这里的$(SRCROOT)
指代的是项目根目录,如果不是很清楚项目根目录是到哪里,有一个简单的方式来确认。.xcodeproj
和.xcworkspace
存在的这个目录绝大多数情况下就是根目录。
使用PCH
提高编译速度
在项目中,我们通常都是使用#import
来引入依赖的文件,在GCC
的预处理阶段需要对于#import
进行如下处理:
- 查找
#import
引入的头文件。 - 找到引入的头文件后,对引入的头文件中的预编译指令(如宏定义等)进行分析。
- 将引入的头文件的内容拷贝到当前头文件中。
还需要提及一个点,如果A
引入了N
个头文件,那么每当项目中有文件引入了A
,那么久需要重复N
次上面的过程。
可能正是基于这一点,苹果提供了PCH
的使用方式。PCH
的好处是,这个文件中的头文件只会被编译一次,之后就会被缓存起来,然后添加到项目中所有的头文件中。也就是说,上面的3个步骤就不需要被执行了,这样一来编译速度被提高是显而易见的了。
为什么我不喜欢PCH
虽然PCH
有上面所说的哪些优势,但是我自己的项目中并没有使用PCH
,原因有如下几点:
- 被全局依赖的
PCH
中的所有头文件。
所有文件都隐式的依赖了PCH
中的所有头文件,但事实上真正需要全局依赖的文件少之又少。实际项目中PCH
大都是被当做便捷#import
的一种手段。 - 不能轻易修改的
PCH
文件。
因为全局依赖了PCH
文件,所以当PCH
中的内容发生改变时,项目中的每个文件都需要进行重新编译。这个时候,项目就必须进行一次彻彻底底,完完全全的项目重新编译。 -
PCH
中的内容可能会被无限扩充。
PCH
的特性决定了PCH
文件的内容基本上不会被删除,只会被添加。而如果不能界定好哪些头文件和宏定义允许被添加到PCH
中,那么PCH
文件的内容就可能会被无限扩充。 - 可移植性降低。
如果要在其它项目中使用现有项目中的类,那么我们要么把PCH
文件一起打包带走,再删除PCH
中多余的头文件引入;要么在需要移植的类中分别引入所需的头文件。这两种方式可都不是什么让人愉快的处理方式。
当然,不同的项目,不同的需求,对PCH
文件的选择也不同。使用或不使用PCH
文件,选择合适自己项目的方式就好。