您的位置:首页 > 移动开发 > Objective-C

Xcode8工程支持PCH

2017-02-06 13:46 141 查看


PCH介绍

PCH文件,是一个预编译文件,常用来处理头文件引用,宏定义等。开发过程中,一般将整个工程都使用的头文件包含在PCH文件下,编译器就会自动的将PCH文件中的头文件添加到所有的源文件中去,很大程度上方便了开发者。


新版Xcode为何不再默认创建PCH文件?

自Xcode6以后,使用xcode创建的默认工程项目,不再包含PCH文件,对此,并没有找到苹果给出的官方解释,综合各方面因素,可能是出于以下方面考虑:

1. 降低各个模块之间的耦合度,PCH文件的存在会增加各个模块之间的耦合度,降低了代码的可复用性,不便于代码迁移。

2. 创建了PCH文件,会一定程度增加build time,出于编译速度的考虑,弃用了PCH。


PCH的应用场景

很多时候,为了解决类似:如果一个宏,很多文件都需要用到;或者一个公共的头文件,很多模块都需要导入这个头文件;发布时,禁用日志输出等问题,PCH便开发者提供了比较便捷的解决方案。PCH最常用的应用场景主要有一下三个:


1.定义一些全局使用的宏

很多时候,我们需要用到各种全局都需要使用的宏定义,此时,PCH就能实现一次定义,全局生效,也便于后期修改和维护,想象一下,你在1000个模块中都使用的同一个宏定义,难道复制粘贴1000次吗?


2.导入全局需要的头文件,例如工具类头文件,分类头文件

全局需要的头文件的情况和全局使用的宏定义类似。


3.自定义日志输出

开发过程中,除了常用的断点调试,我们还会经常使用日志输出的形式来调试代码。但是日志输出非常消耗性能,一般在正式发布应用时,我们会禁用日志输出。想象一下,发布前,要找到所有的NSLog并全部注释或者删除,是多浪费时间的一件事。此时,我们便可以再PCH中自定义一个日志输出,并加上条件编译,这个问题将迎刃而解。


Xcode6及其以后的版本添加PCH文件


1.创建PCH文件

打开工程项目,CMD+N弹出新建文件界面:



找到other,点击PCH File,PCH命名一般和工程名相同,勾选Targets。



点击完成,打开PCH文件,看到默认个的内容如下所示

此时,我们在PCH文件中定义一个全局使用的宏,
#define MAXCHATCNT 100


如果此时直接编译,和没创建PCH文件没有任何不同,因为PCH文件需要设置提前编译。


2.设置PCH提前编译

选择工程项目,点击build settings,选择all,搜索“prefix header”,



双击prefix header,



填入PCH的路径,然后就可以愉快的编译了。之后试试在其他文件中使用定义的全局宏。


PCH使用提示


1.存放全局宏定义和公共头文件

这两种情况,直接参考上一节即可。不多做说明,有任何不清楚的地方,均可留言。


2.条件编译自定义日志输出

重点讲解一下,如何合理的利用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文件能一定程度上方便我们的开发,但是也有一定的弊端,如何取舍,还需多多斟酌。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c xcode mac ios PCH