为什么未在Xcode 6中自动创建ProjectName-Prefix.pch?


264

为什么不在中ProjectName-Prefix.pch自动创建Xcode 6

不再需要预编译头了吗?

我应该在哪里写ProjectName-Prefix.pch以前的代码?

Answers:


136

我怀疑是因为有模块,从而消除了对的需要#import <Cocoa/Cocoa.h>

至于将代码放在前缀标头中的位置,没有代码应放在前缀标头中。将导入文件放入需要它们的文件中。将定义放入自己的文件中。放置宏...无处。除非没有其他方法(例如,当需要时__FILE__),否则停止编写宏。如果确实需要宏,请将其放在标头中并包含它。

对于庞大的事物,整个系统中几乎所有事物(例如Foundation.h)都需要使用前缀标头。如果您拥有庞大而无处不在的东西,则应该重新考虑您的体系结构。前缀标头使代码难以重用,并且如果列出的任何文件可以更改,都会引起细微的构建问题。避免使用它们,直到出现严重的构建时间问题为止,您可以证明前缀前缀显着改善了构建时间。

在这种情况下,您可以创建一个并将其传递给clang,但这是一个好主意,这种情况很少见。


编辑:对于您在所有视图控制器中使用的HUD的特定问题,是的,您应该绝对将其导入到实际使用它的每个视图控制器中。这使依赖关系变得清晰。当您在新项目中重新使用视图控制器时(如果很好地构建控制器,这很常见),您将立即知道它的需求。这对于类别尤其重要,如果类别是隐式的,这会使代码很难重用。

没有PCH文件可以消除列表依赖性。您仍然应该像Xcode模板一样导入UIKit.hFoundation.h根据需要导入。PCH的原因是在处理真正庞大的标头时(如在UIKit中),可以缩短构建时间。


102
@Rob您的答案是主观的。我不同意将其作为该问题的答案。没有pch,您将如何实现类似github.com/seancook/TWReverseAuthExample/blob/…的东西?将日志导入每个文件?这在您的代码中造成了一堆不必要的膨胀。
Maxim Veksler 2014年

26
是的,每个实际使用该宏的文件都是(根据我的经验,这通常少于系统中的每个文件)。这是我观点的一个很好的例子。导入它隐式掩盖了您对此日志记录宏有依赖性的事实。TWAPIManager.m例如,当您尝试将其复制到另一个项目时,会得到TWALog()未定义的错误,并且没有提示在哪里找到它的提示。我在试图共享代码的几个大型项目中遇到了这个问题。创建TWAPILog.h和导入它可以用很小的开发成本解决这个问题。
罗布·纳皮尔

5
我几乎在每个班级都使用ReactiveCocoa,如果不使用pch文件对我来说是疯狂的……
Stefano Mondino 2014年

2
不仅模块,而且迅速的支持可能是很大的一部分。
uchuugaka

12
关键是PCH是预编译的标头。预编译用于构建性能,而不是自动可用性。预编译引入了多种方法来弄乱您的构建,并且应该保留给那些在不干净的构建(例如Foundation)之间永远不会改变的大型事物。
罗布·纳皮尔2014年

425

无需怀疑是否正确,您可以手动添加PCH文件:

  1. 将新的PCH文件添加到项目中:新建文件>其他> PCH文件

  2. 在Tar​​get的Build Settings选项中,将Prefix Header的值设置为您的PCH文件名,并以项目名称作为前缀(即,对于名为的项目TestProject和名为的PCH文件MyPrefixHeaderFile,将其值添加TestProject/MyPrefixHeaderFile.pch到plist)。

    提示:您可以使用$(SRCROOT)或之类的方法$(PROJECT_DIR)来获取将其放置.pch在项目中的路径。

  3. 在“目标”的“ 构建设置”选项中,将“ 预编译前缀头”的值设置为YES


32
尽管我对PCH文件有意见,但+1。对于人们了解如何使用工具仍然有用。
罗布·纳皮尔2014年

20
@Yedidya,尽管您有任何判断,但我还是想抽出宝贵的时间来表达问题的答案,我只想对此表示快速感谢。当人们花时间真诚地回答问题,而不是仅仅就问题的严重程度对人be之以鼻时,我深表感谢。
campo 2014年

3
谢谢。当将我的一些Objective-C合并到Swift项目中时,我发现它很有用,因此我不必回头向每个.m文件中添加一堆include文件。
克里斯·普林斯

从ObjC过渡到Swift时非常方便-我有一堆用ObjC编写的库,我要做的最后一件事是编辑所有库以包含正确的系统头文件。
梯队

1
这对我不起作用,因为我使用了目标的构建设置。但是,当我按照此说明进行修改项目构建设置时,一切正常。

128

您需要创建自己的PCH文件
添加New file -> Other-> PCH file

然后将此PCH文件的路径添加到您的构建中 setting->prefix header->path

($(SRCROOT)/filename.pch)

在此处输入图片说明


3
好吧,取决于工作目录,变量可能会有所不同。我正在使用$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
AlejandroIván2015年

如果将.pch文件保留在特定的文件夹中,则会出现这种情况。
Prakash Raj 2015年

51

我给你看一张照片!

  1. 新增档案 新增档案

  2. 转到项目/构建设置/ APPl LLVM 6.0-语言 新增档案


24

要添加.pch文件,请执行以下操作:

1)将新的.pch文件添加到您的项目->新文件->其他-> PCH文件

2)转到项目的构建设置。

3)搜索“前缀头”。您可以在Apple LLVM下找到它。

4)将此粘贴到字段中 $(SRCROOT)/yourPrefixHeaderFileName.pch

5)清理并构建项目。而已!!!

在此处输入图片说明


12

如果您决定手动添加.pch文件,并且希望像xCode 6之前一样使用Objective-C,则还必须在.pch文件中导入UIKit和Foundation框架。否则,您将必须在每个头文件中手动导入这些框架。您可以在测试所用语言时始终添加以下代码:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

2
涉及ObjC代码的所有内容都必须包裹在上述#ifdef _ OBJC _内,否则,您将从C源代码中得到错误(如果您有这样的源代码),而您将永远无法理解
ishahak 2015年


7

要添加新的PCH文件,请执行以下步骤:

(1)添加新文件-选择iOS-其他和PCH文件

(2)将此PCH文件的路径添加到您的项目-BuildSetting-Apple LLVM 6.0语言

添加集前缀报头路径YourApplicationName(root-path)/filename.pch


请解释最后一个。添加设置前缀标头路径。
纳韦德·阿巴斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.