PCH文件的优缺点
2017-05-23 本文已影响168人
简欲明心
PCH文件:文件名由“工程名-Prefix.pch”构成的预编译头文件。XCode6之前会在Supporting Files文件夹下自动生成,之后则需要手动创建。
一、PCH文件的作用
1. 定义全局性宏;
2. 引用全局性头文件;
3. 根据运行环境,自动打开或者关闭日志输出功能。
二、PCH文件的优点(产生原因)
1. PCH文件的内容能被项目中的其他所有文件共享和访问,其他地方可直接使用,不用再手动重复定义或引用;
2. 预编译后的头文件会被缓存起来,再次编译时,就不需要重新编译PCH文件中导入的内容,从而提高编译速度。
三、PCH文件的缺点(谨慎使用的原因)
1. 大量的共用性不高的宏定义和头文件引入,会导致编译时整个工程范围地查找和替换这些宏定义字段,或重复导入这些头头文件,造成时间过长;
2. 把类中使用的框架等放入到PCH中,依赖关系不明确,不利于代码的迁移和解耦,降低了代码的可移植性和复用性。
四、对PCH文件使用的一些思考
1. PCH的目的是:提高编译速度,而不是少敲几行import;
2. 造成这些问题的原因在于对PCH文件的使用方式和方法不对。所以,要正确的、适度的使用PCH文件,扬长避短,不要滥用;
3. 可以考虑按照层级或者功能模块等方式,定义多个头文件。将该层级或者模块共用性较高的宏或文件写入,供本层使用。如果整个工程需要使用,再导入PCH文件。这样既可以避免或减少同一个且多余的文件被重复编译,增加编译时间,又可以方便地使用一些全局的东西。
4. 关于宏定义:宏定义是在预编译的时候处理的。因此,当你修改宏定义的时候 会导致大量的代码被重新编译。另外,宏定义存在许多潜在的bug是因为在预编译的时候,它并不会被发觉到。替代宏定义,可以考虑使用常量const。
5. 关于引用:iOS7之后,系统的Module都可以被”semantic import”。使用起来很简单,把原来的#import换成@import即可。比如:#import <Foundation/Foundation.h>; 换成@import Foundation; 即可。编译器遇到@import时,会将预编译好的framework载入,同时也不需要到project settings里添加framework,系统会帮你做这些事情。这些Module只会编译一次。