【问题标题】:Why isn't ProjectName-Prefix.pch created automatically in Xcode 6?为什么 Xcode 6 中没有自动创建 ProjectName-Prefix.pch?
【发布时间】:2014-08-01 06:11:53
【问题描述】:

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

是否不再需要预编译头文件?

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

【问题讨论】:

    标签: ios xcode xcode6


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 请解释最后一个。添加设置前缀头路径。
    【解决方案2】:

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

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

    ($(SRCROOT)/filename.pch)

    【讨论】:

    • 嗯,根据工作目录,变量可能会有所不同。我正在使用$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
    • 如果您将 .pch 文件保存在特定文件夹中,则出现这种情况。
    【解决方案3】:

    我给你看一张照片!

    1. 添加新文件

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

    【讨论】:

      【解决方案4】:

      使用:

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

      【讨论】:

      • “项目名称”是否存在任何 $ 类型的声明??
      【解决方案5】:

      不问是否正确,您可以手动添加PCH文件:

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

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

        提示:您可以使用 $(SRCROOT)$(PROJECT_DIR) 之类的东西来找到您在项目中放置 .pch 的路径。

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

      【讨论】:

      • 尽管我对 PCH 文件有意见,+1。人们知道如何使用这些工具仍然很有用。
      • @Yedidya,我只想快速感谢您抽出时间来传达问题的答案,尽管您对此有任何判断。我很感激人们花时间亲切地回答问题,而不是仅仅斥责这个人对这个问题的建议有多么糟糕。
      • 谢谢。我发现在将我的一些 Objective-C 合并到 Swift 项目中时它很有用,因此我不必返回并为每个 .m 文件添加一堆包含文件。
      • 从 ObjC 过渡到 Swift 时非常方便 - 我有一堆用 ObjC 编写的库,我最不想做的就是编辑所有这些库以包含正确的系统头文件。
      • 这对我不起作用,因为我使用了目标的构建设置。但是,当我按照此说明修改项目构建设置时,一切正常。
      【解决方案6】:

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

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

      【讨论】:

      • 所有涉及 ObjC 代码的东西都必须包含在上面的#ifdef _ OBJC _ 中,否则你会从 C 源代码中得到错误(如果你有这样的源代码),你永远不会明白
      【解决方案7】:

      添加 .pch 文件-

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

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

      3) 搜索“前缀标题”。你可以在 Apple LLVM 下找到它。

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

      5) 清理并构建项目。 就是这样!!!

      【讨论】:

        【解决方案8】:

        我怀疑是因为模块,它消除了对 #import &lt;Cocoa/Cocoa.h&gt; 的需要。

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

        对于庞大且几乎被整个系统中的所有东西使用的东西(如Foundation.h),前缀标头是必需的。如果你有如此庞大而无处不在的东西,你应该重新考虑你的架构。前缀标头使代码重用变得困难,并且如果列出的任何文件都可以更改,则会引入细微的构建问题。避免使用它们,直到您遇到严重的构建时间问题,您可以证明使用前缀标头可以显着改善。

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


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

        PCH 文件不是用来摆脱列表依赖的。您仍应根据需要导入 UIKit.hFoundation.h,就像 Xcode 模板所做的那样。 PCH 的原因是在处理非常大的标头时(例如在 UIKit 中)缩短构建时间。

        【讨论】:

        • @Rob 你的回答是主观的咆哮。我不同意它应该被接受为这个问题的答案。如果没有 pch,您将如何实现类似 github.com/seancook/TWReverseAuthExample/blob/… 的东西?将日志导入每个文件?这会在您的代码中造成一大堆不必要的臃肿。
        • 每个实际使用该宏的文件,是的(根据我的经验,这通常少于系统中的每个文件)。这是我观点的一个很好的例子。导入它隐含地掩盖了您依赖此日志记录宏的事实。例如,当您尝试将TWAPIManager.m 复制到另一个项目时,您将收到TWALog() 未定义的错误,并且没有提示在哪里可以找到它。我在几个试图共享代码的大型项目中遇到了这个问题。创建 TWAPILog.h 并导入它以微不足道的开发成本解决了这个问题。
        • 我几乎在每个班级都使用 ReactiveCocoa,不使用 pch 文件对我来说太疯狂了......
        • 不仅是模块,而且快速支持可能是一大块。
        • 关键是PCH是一个预编译头。预编译是为了构建性能,而不是自动可用性。预编译引入了几种方法来搞乱你的构建,并且应该保留用于在非干净构建之间永远改变的巨大事物(如 Foundation)。
        猜你喜欢
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多