【发布时间】:2014-07-02 03:37:12
【问题描述】:
许多开发人员正在向Prefix.pch 添加各种便利宏。但我的问题是Prefix.pch 文件是什么。
如果我从我的
Xcode中删除那个Prefix.pch文件,那么我的应用程序会运行吗?或者它会显示任何错误?还是会在构建过程中崩溃?如何在没有
Prefix.pch文件的情况下运行我的应用程序
【问题讨论】:
许多开发人员正在向Prefix.pch 添加各种便利宏。但我的问题是Prefix.pch 文件是什么。
如果我从我的Xcode 中删除那个Prefix.pch 文件,那么我的应用程序会运行吗?或者它会显示任何错误?还是会在构建过程中崩溃?
如何在没有Prefix.pch 文件的情况下运行我的应用程序
【问题讨论】:
Prefix.pch 是预编译的标头。发明了预编译头文件以加快编译速度。这些文件无需一遍又一遍地解析相同的头文件,而是提前解析一次。
在 Xcode 中,您可以在“前缀头文件”中添加所需头文件的导入,并启用 Precompile Prefix Header 以便它们被预编译。但是前缀头背后的想法与预编译不同。
前缀头隐含在每个源文件的开头。就像每个源文件都添加了一样
#import "Prefix.pch"
在文件的顶部,在其他任何东西之前。
您可以删除预编译的标头。我在下面链接的线程中已经回答了这个问题。它包含您需要的所有信息以及有用的 cmets。
【讨论】:
.pch 是预编译的头文件。
在 C 和 C++ 编程语言中,头文件是一个文件,其文本可以由 C 预处理器自动包含在另一个源文件中,通常通过在源文件中使用编译器指令来指定。
前缀头被编译并存储在缓存中,然后在编译期间自动包含在每个文件中。这可以加快编译速度,并允许您包含一个文件,而无需向使用它的每个文件添加导入语句。它们不是必需的,而且在您更改它们时实际上会降低编译速度。
在 Xcode 中,转到目标的构建设置(Command-Option-E,构建选项卡)并取消选中 Precompile Prefix Header (GCC_PRECOMPILE_PREFIX_HEADER)。如果您愿意,也可以删除 Prefix Header 设置的值。
不要将宏放在 .pch 文件中!根据定义,.pch 文件是项目特定的预编译头文件。它真的不应该在项目的上下文之外使用,它真的不应该包含除了#includes 和#imports 之外的任何东西。
如果你有一些宏并且你想在头文件之间共享,然后将它们粘贴到它们自己的头文件中——Common.h 或其他文件——并在 .pch 的开头#include
【讨论】:
前缀头被编译并存储在缓存中,然后在编译期间自动包含在每个文件中。这可以加快编译速度,并允许您包含一个文件,而无需向使用它的每个文件添加导入语句。它们不是必需的,而且在您更改它们时实际上会降低编译速度。
一般.pch文件命名格式为yourProjectName-Prefix.pch
【讨论】:
前缀标头和预编译标头 (.pch)
历史:
#include => #import => Precompiled Headers .pch => @import Module(ObjC); => import Module(Swift)
[@import Module(ObjC);]
[import Module(Swift)]
预编译头文件 - prefix.pch
创建新的 .pch 文件
File -> New -> File... -> PCH File
PrefixHeader.pch 示例:
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
从 Xcode 6 开始,您应该手动设置 .pch。以前称为<product_name>-Prefix.pch
Xcode:
Prefix Header(GCC_PREFIX_HEADER) - 到.pch 的路径。将.pch 中的所有内容添加到所有源文件
SomeFile1.h
//You can skip this section. It will be compiled
//#import <UIKit/UIKit.h>
//#import <Foundation/Foundation.h>
//implicitly next line is used
#import "PrefixHeader.pch"
Precompile Prefix Header(GCC_PRECOMPILE_PREFIX_HEADER) - 当Yes 时,来自GCC_PREFIX_HEADER 的Prefix headers 将被使用一次* 以生成预编译源并将存储在缓存中,从而加快构建时间
//path to cached precompiled headers
/<some_path>/DerivedData/ExperiementsModuleSwift-dsetoksxykdmgvczgtnmaqmjwhzk/Build/Intermediates.noindex/PrecompiledHeaders/SharedPrecompiledHeaders/14385052922615550324
//e.g
/Users/alex/Library/Developer/Xcode/DerivedData/ExperiementsModuleSwift-dsetoksxykdmgvczgtnmaqmjwhzk/Build/Intermediates.noindex/PrecompiledHeaders/SharedPrecompiledHeaders/14385052922615550324
#import vs .pch
#import 有一个缺点 - 慢构建时间。
Precompile Header - 缩短构建时间,因为预编译 prefix headers(global)。当prefix headers 的某些内容发生更改时,意味着编译必须再次重新编译。这就是为什么你应该在这里使用稳定的(不经常改变的)prefix headers,否则你看不到构建时间的改进。另外你不应该滥用它,因为这项工作是隐含的,很难支持这样的系统
【讨论】: