iOS-PCH文件设置

Xcode6之前,创建一个新的项目之后,会自动在Supporting files文件夹下面创建一个“工程名-Prefix.pch”文件。
Xcode6之后,可能是因为程序员把大量的宏定义和头文件放在pch中,导致编译时间过长,苹果去掉它,可能是为了加快编译速度,提高用户体验。
(1)去掉自动导入的系统框架类库的头文件,可以提高原文件的复用性,便于迁移。
(2)一个肥胖无比的Prefix Header会大大增加Build Time。

创建PCH文件:

1.右击选择 New File,出现下面界面

iOS-PCH文件设置

2.点击create,就会生成一个pch文件

iOS-PCH文件设置

3.点击左侧栏中的工程名,显示如下界面,然后通过在搜索栏里查找Prefix Header文件,快速定位到pch,然后按照下面方式操作

iOS-PCH文件设置

4.将pch文件拖进第三步弹出的框里面,pch的文件路径就会被填进去,但是这是绝对路径,如果你把项目移到另外一个地方,就会报错,找不到pch文件,所以需要把它转为相对路径,绝对路径格式:/Users/lixue/Desktop/项目名/项目名/PrefixHeader.pch,转化为相对路径,如下格式$(SRCROOT)/项目名/PrefixHeader.pch(注意这里只有一个项目名)

iOS-PCH文件设置

注意这里有一个选项:Precompile Prefix Header

iOS-PCH文件设置

这里开关Precompile Prefix Header时,PCH的编译和导入机制是有很大不同的。如果Precompile Prefix Header为YES,那么pch会被预编译,预编译后的pch文件会被缓存起来,从而提高编译速度。可以从下面的Build Log中看出:

iOS-PCH文件设置

如果Precompile Prefix Header为NO,那么pch不会被预编译,而是在每一个用到它导入的框架类库的.m文件中编译一次。例如a-Prefix.pch导入了,ViewController.m和AppDelegate.m中都使用了objc_property_t这个类型(注意ViewController.h/m和AppDelegate.h/m都没有另外导入),那么在Build的过程中,在编译ViewController.m和AppDelegate.m时,a-Prefix.pch会被编译2次,每个.m文件编译一次。如下图:

iOS-PCH文件设置

由图可知,如果Precompile Prefix Header为NO,那么每个引用了pch内容的.m文件都要编译一次pch,可能Apple会另外做缓存机制,但是这样还是降低了编译的速度。

既然Apple标准都建议我们不用pch了,那么还是尽量少用吧。当然,如果一定要用,还是尽量减少pch文件中的内容,降低工程对pch文件的依赖性,便于日后的迁移和解耦。