iOS PCH文件

以前的iOS工程中创建的时候会自带一个pch文件,但是在Xcode6(印象中是Xcode6 )之后,这个文件系统就不自带了,如果想用的话,是需要开发者自己去创建的,到底pch文件有什么作用,该如何创建,本文就来简单探讨一下。

pch文件是一个标准的预编译头文件(Precompiled Header),PCH文件的内容能被项目中的其他所有源文件共享和访问,一般我们在开发中需要用到的一些全局的宏之类的就可以放到这个文件里,对应的类中需要用到可以直接使用,不需要额外导入头文件(当然了 ,你也可以将所有的宏定义放入一个.h的文件中,在你需要的地方导入这个头文件就好了)

在新版本的Xcode中如何创建并配置使用PCH文件

  1. 创建PCH文件
    1.1 右键NewFile(快捷键:command + n)


    iOS PCH文件_第1张图片
    image.png

    1.2 Other --> PCH


    iOS PCH文件_第2张图片
    image.png

    1.3 命名方式 (默认文件名PrefixHeader),建议命名方式(工程名+PrefixHeader)
    示例:工程名为HuiJin , 那么该PCH文件即可命名为HuiJinPrefixHeader(这是一种习惯,当然了,你也可以不这么命名,但是会显得比较另类)
  2. 由于非系统自带,所以创建的这个PCH文件需要手动配置,具体如下所示:
    (备注:将Precompile Prefix Header为YES,预编译后的pch文件会被缓存起来,可以提高编译速度)


    iOS PCH文件_第3张图片
    B84CAB80-6B1F-402A-A0D2-1C9910DF7519.jpeg

TARGETS --> Build Settings --> All --> 搜索Prefix -->修改Precompile Prefix Header(默认为NO,修改为YES) -->修改Prefix Header路径(这里修改为改PCH文件的相对路径)

查看PCH文件路径的具体方式
1.选中PCH文件


image.png

2.如图所示


iOS PCH文件_第4张图片
077340B4-E8C2-443E-80E9-16E4FF748453.jpeg

这里的full Path是完整路径,其实就是绝对路径,一般我们都是配置相对路径即可(如果配置绝对路径,别人拿到你的代码,那路径就会出问题),相对路径其实就是你相对于该工程最外层的路径
我们可以看下工程文件 的 具体路径及层级结构,右键show in find 如下所示:


iOS PCH文件_第5张图片
image.png

可以看到这个PCH文件就在HuiJinMenu文件夹下,那么他的相对路径就是HuiJinMenu/HuiJinMenuPrefixHeader.pch,其实也可以在Full Path中截取

接下来看看使用,我们在改PCH文件中定义一个宏看看:

#define iOS11  ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.f)?1:0

我们会发现工程中的所有文件中你都可以使用该宏,不需要在引入其他的头文件,使用起来很方便,当然了,你也可以引入你需要的其他头文件

Xcode6之后呢,苹果默认取消了这个PCH文件,有的人说是PCH降低了编译速度,为了用户体验去掉了该文件,后面大部分人就不用这个PCH文件了

是不是真的降低了编译速度,着各种权威性的结论真不好说,我们就说下怎么尽可能正确的使用该文件

1.不要把所有的宏定义都放到改文件中,尤其是公用型较小的宏定义
2.不要把左右的.h文件放在该文件中,这大大增加了编译时间,也就是常说的编译时间会很长
3.当你导入的文件中包含有相关的东邪是,需要添加以下代码,将其宏定义放入之间,如下图所示

image.png

具体可以参考这个帖子里说的
https://stackoverflow.com/questions/24158648/why-isnt-projectname-prefix-pch-created-automatically-in-xcode-6

现在就算会正确使用PCH,最近越来越多的开发者不再使用PCH文件,究其原因如下(个人想法)

  1. 宏定义、常用框架所谓的在项目中的公用性 到底高不高,怎么样才算是高,这个很难把握,有时候会纠结,所以干脆直接简单粗暴不用
  2. 可复用性稍显尴尬,另一个项目需要用到该项目中的相关类,你直接拖过去肯定不行,因为你的一些头文件可能在PCH文件中,那就干脆讲PCH文件也拖过去,那你就需要修改PCH文件,删除没用的代码,这个代价其实也是蛮大的,如果你的项目相当大,那你哭的心都有了

如果不使用PCH文件,那么公共的宏,框架和第三方库如何处理?
这里可以提供2个思路。

  1. 继承。在父类中定义所需要的宏,导入第三方的框架,需要是只需要继承自其父类就可以了
  2. 创建Header File ,这个就是一个.h文件,你可以讲你需要的宏、三方库头文件导入,需要用的类中只需要导入该文件即可(该文件与PCH不一样的是,PCH属于全局的那种,哪里都可以访问,这个相对比较局部,必须导入该文件,才可以使用其中的内容)

PCH相关的内容就简单说这么多,希望可以帮到小白,也算是自己的一个简单总结,如果有内容错误,还望各位小伙伴指正

你可能感兴趣的:(iOS PCH文件)