PCH介绍
PCH文件,是一个预编译文件,常用来处理头文件引用,宏定义等。开发过程中,一般将整个工程都使用的头文件包含在PCH文件下,编译器就会自动的将PCH文件中的头文件添加到所有的源文件中去,很大程度上方便了开发者。
自Xcode6以后,使用xcode创建的默认工程项目,不再包含PCH文件,对此,并没有找到苹果给出的官方解释,综合各方面因素,可能是出于以下方面考虑:
1. 降低各个模块之间的耦合度,PCH文件的存在会增加各个模块之间的耦合度,降低了代码的可复用性,不便于代码迁移。
2. 创建了PCH文件,会一定程度增加build time,出于编译速度的考虑,弃用了PCH。
很多时候,为了解决类似:如果一个宏,很多文件都需要用到;或者一个公共的头文件,很多模块都需要导入这个头文件;发布时,禁用日志输出等问题,PCH便开发者提供了比较便捷的解决方案。PCH最常用的应用场景主要有一下三个:
很多时候,我们需要用到各种全局都需要使用的宏定义,此时,PCH就能实现一次定义,全局生效,也便于后期修改和维护,想象一下,你在1000个模块中都使用的同一个宏定义,难道复制粘贴1000次吗?
全局需要的头文件的情况和全局使用的宏定义类似。
开发过程中,除了常用的断点调试,我们还会经常使用日志输出的形式来调试代码。但是日志输出非常消耗性能,一般在正式发布应用时,我们会禁用日志输出。想象一下,发布前,要找到所有的NSLog并全部注释或者删除,是多浪费时间的一件事。此时,我们便可以再PCH中自定义一个日志输出,并加上条件编译,这个问题将迎刃而解。
打开工程项目,CMD+N弹出新建文件界面:
找到other,点击PCH File,PCH命名一般和工程名相同,勾选Targets。
点击完成,打开PCH文件,看到默认个的内容如下所示
此时,我们在PCH文件中定义一个全局使用的宏,
#define MAXCHATCNT 100
如果此时直接编译,和没创建PCH文件没有任何不同,因为PCH文件需要设置提前编译。
选择工程项目,点击build settings,选择all,搜索“prefix header”,
双击prefix header,
填入PCH的路径,然后就可以愉快的编译了。之后试试在其他文件中使用定义的全局宏。
这两种情况,直接参考上一节即可。不多做说明,有任何不清楚的地方,均可留言。
重点讲解一下,如何合理的利用PCH,方便的解决日志输出的烦恼。
1.首先按照之前的步骤创建PCH文件。
2.在PCH文件中自定义日志输出
#define MyLog(...) NSLog(__VA_ARGS__)
其中“...”表示可变参数,“__VA_ARGS__”表示左边的"..."会替换右侧NSLog中的参数。
以后当需要使用NSLog的地方,全部使用MyLog替代。
因为是调试阶段才让日志输出有效,因此,PCH中使用条件编译。
#ifdef DEBUG
#define MyLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...)
#endif
其中DEBUG是xcode自动生成的一个宏,可以自己选择
notes:
PCH使用时,一定要注意,为了确保PCH中的代码只在OC中生效,一定要加上条件编译,避免项目中有C代码时,报错。一般按照如下方式定义:
#ifdef __OBJC__
#ifdef DEBUG
#define MyLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...)
#endif
#endif
PCH文件能一定程度上方便我们的开发,但是也有一定的弊端,如何取舍,还需多多斟酌。