iOS pch

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 换成 @import Foundation; 即可。编译器遇到 @import 时,会将预编译好的 framework 载入,同时也不需要到 project settings 里添加 framework,系统做这些事情。这些 Module 只会编译一次。

⑥、如果不使用 pch,可以使用继承处理公用的宏、框架和三方库。在父类的头文件中定义宏和导入共用框架、三方库,需要用到的去继承。

⑦、宏、框架和三方库共用性高不高有时候很难去界定和把握,就会造成纠结状态,干脆尽量不用了。

五、文章

PCH 文件的优缺点

PCH文件的新建和其缺点

posted @ 2020-02-26 13:29  和风细羽  阅读(553)  评论(0编辑  收藏  举报