Xcode6 之前会在 Supporting Files 文件夹下自动生成一个“工程名-PrefixHeader.pch”的预编译头文件,pch 头文件的内容能被项目中的其他所有源文件共享和访问。Xcode 6.0之后则需要手动创建。
一、作用
①、定义全局性宏;
②、引用全局性头文件;
③、根据运行环境,自动打开或者关闭日志输出功能。
二、优点
①、PCH 文件的内容能被项目中的其他所有文件共享和访问,其它地方可直接使用,不用再手动重复定义或引用;
②、预编译后的头文件会被缓存起来,再次编译时不需要重新编译 PCH 文件中导入的内容,从而提高编译速度。
三、缺点
①、把类中使用的框架等放到 PCH 中,依赖关系不明确,不利于代码的迁移和解耦,降低了代码的可移植性和复用性。
②、大量的共用性不高的宏定义和头文件引入,会导致编译时整个工程范围地查找和替换这些宏定义字段,或重复导入这些头文件,造成时间过长;
四、思考
①、PCH 的目的是:提高编译速度,而不是少敲几行 #import;
②、造成这些问题的原因在于对 PCH 文件的使用方式和方法不对。要正确、适度的使用 PCH 文件,不要滥用;
③、可以考虑按照层级或者功能模块等方式,定义多个头文件。将该层级或者模块共用性较高的宏或文件写入,供本层使用。如果整个工程需要使用,再导入 PCH 文件。这样既可以避免或减少同一个且多余的文件被重复编译,增加编译时间,又可以方便地使用一些全局的东西。
④、关于宏定义:宏定义是在预编译的时候处理的。因此,当你修改宏定义的时候会导致大量的代码被重新编译。另外,宏定义存在许多潜在的 bug 是因为在预编译的时候,它并不会被发觉到。替代宏定义,可以考虑使用常量 const。
⑤、关于引用:iOS7 之后,系统的 Module 都可以被 "semantic import"。把原来的 #import 换成 @import 即可。比如:#import
⑥、如果不使用 pch,可以使用继承处理公用的宏、框架和三方库。在父类的头文件中定义宏和导入共用框架、三方库,需要用到的去继承。
⑦、宏、框架和三方库共用性高不高有时候很难去界定和把握,就会造成纠结状态,干脆尽量不用了。