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

Wei*_*Wei 261 xcode ios xcode6

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

是否不再需要预编译头?

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

Yed*_*iss 424

如果没有问题,您可以手动添加PCH文件:

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

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

    提示:您可以使用之类的东西$(SRCROOT)或者$(PROJECT_DIR),你把去的路径.pch在项目中.

  3. 在Tar​​get的Build Settings选项中,将Precompile Prefix Header的值设置为YES.

  • 尽管我对PCH文件有意见,但+1.人们知道如何使用这些工具仍然很有用. (32认同)
  • @Yedidya,我只是想快速感谢你花时间传达问题的答案,尽管你对此有任何判断.当人们花时间亲切地回答问题时,我感激不尽,而不仅仅是谴责这个问题是多么不明智的人. (20认同)
  • 谢谢.我发现将一些Objective-C合并到Swift项目中时很有用,所以我不必回过头来为每个.m文件添加一堆包含文件. (3认同)

Rob*_*ier 135

我怀疑是因为模块,因此无需使用#import <Cocoa/Cocoa.h>.

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

前缀头是巨大的东西所必需的,并且几乎被整个系统中的所有东西使用(比如Foundation.h).如果你有一些巨大而无处不在的东西,你应该重新思考你的架构.前缀标题使代码重用变得困难,并且如果列出的任何文件可能发生更改,则会引入细微的构建问题.避免使用它们,直到您遇到严重的构建时问题,您可以通过前缀标头显着改进该问题.

在这种情况下,你可以创建一个并将其传递给clang,但这是一个好主意,这是非常罕见的.


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

PCH文件不是为了摆脱列表依赖性.您仍然应该像Xcode模板那样导入UIKit.hFoundation.h根据需要导入.PCH的原因是在处理真正庞大的头文件时(例如在UIKit中)改善构建时间.

  • @Rob你的回答是主观的咆哮.我不同意它应该被接受作为这个问题的答案.你如何实现这样的东西https://github.com/seancook/TWReverseAuthExample/blob/635d02f76b2ccf7f8574429a624cb41a5ece552e/Source/Other/TWiOSReverseAuthExample-Prefix.pch#L24没有pch?将日志导入每个文件?这会在代码中造成一堆不必要的膨胀. (102认同)
  • 实际使用该宏的每个文件,是(根据我的经验,这通常少于系统中的每个文件).这是我的观点的一个很好的例子.隐式导入它会掩盖您对此日志记录宏具有依赖性的事实.例如,当您尝试将`TWAPIManager.m`复制到另一个项目时,您将收到错误,即未定义TWALog()`,而没有提示找到它的位置.我在几个试图共享代码的大项目中遇到了这个问题.创建`TWAPILog.h`并导入它可以解决这个问题. (26认同)
  • 关键是PCH是*预编译头*.预编译用于构建性能,而不是自动可用性.预编译介绍了几种搞乱构建的方法,并且应该保留用于在非干净构建(例如Foundation)之间永远不会改变的大事. (12认同)
  • 我几乎在每个班级都使用ReactiveCocoa,对我来说不使用pch文件会很疯狂...... (5认同)
  • 不仅模块,而且快速支持可能是一大块. (2认同)
  • @shim我总是使用自己的日志记录宏,可以在不同的配置中删除或重新配置.将该宏放在标题中; 导入您使用它的标题.即使我相信将pch用于那种宏,我也绝不会写一个宏来重新定义NSLog本身.重写标准功能非常混乱. (2认同)

小智 126

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

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

($(SRCROOT)/filename.pch)

在此输入图像描述

  • 那么,根据工作目的,变量可能会有所不同.我使用的是`$(PRODUCT_DIR)/ $(PRODUCT_NAME)/ PrefixHeader.pch` (3认同)

Sle*_*mon 51

我会给你看一张照片!

  1. 添加新文件 添加新文件

  2. 转到项目/构建设置/ APPl LLVM 6.0-语言 添加新文件


小智 23

要添加.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
Run Code Online (Sandbox Code Playgroud)

  • 涉及ObjC代码的所有内容都必须包含在上面的#ifdef _ _OBJC_ _中,否则你将从C源获得错误(如果你有这样的来源)你永远不会理解 (2认同)

小智 7

要添加新的PCH文件,请按照以下步骤操作:

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

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

添加设置前缀标题路​​径YourApplicationName(root-path)/filename.pch


Ara*_*ini 7

使用 :

$(PROJECT_DIR)/项目名称/ PrefixHeader.pch