为啥 Xcode 模板的 #imports 与 Prefix.pch 重复?

Posted

技术标签:

【中文标题】为啥 Xcode 模板的 #imports 与 Prefix.pch 重复?【英文标题】:Why do Xcode templates have #imports that duplicate Prefix.pch?为什么 Xcode 模板的 #imports 与 Prefix.pch 重复? 【发布时间】:2011-06-24 01:05:53 【问题描述】:

在学习 iPhone 编程时,我见过的每个 Xcode 模板都包含一个 AppName-Prefix.pch 文件,其内容如下:

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

我的理解是这个文件的内容是在编译之前给每个源代码文件加上前缀的。然而,其他每个文件也都导入了 UIKit,这似乎是多余的。例如,main.m 开始...

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) 
...

Mac OS X 中的 Cocoa 应用程序做同样的事情,在前缀文件和头文件中都导入 Cocoa.h。

为什么两者都有?我从除前缀文件之外的所有源文件中删除了#import 指令,它编译并正确运行。

【问题讨论】:

【参考方案1】:

我的理解是这个文件的内容是在编译之前给每个源代码文件加上前缀

这基本上是正确的,但您需要了解其中的细微之处:Xcode 的每次编译最终都归结为对gccclang 的调用。 XCode 所做的就是先编译X.pch 文件:

clang -x X.pch -o X.pch.gch

然后当一个单独的源文件(比如a.m)被编译时,它会发出

clang -include X.pch a.m -o a.o

加载pch 文件,触发预编译头文件的使用。所以,从编译器的角度来看pch 文件的内容并不是自动加前缀的。相反,Xcode 在调用编译器时会将预编译的头文件添加到文件中。

XCode 的未来版本可能会停止这样做。因此,最好将#imports 也保留在您的.m.h 文件中。

你也可以这样想:pch文件的使用正是Xcode在幕后为我们做的加速编译过程。因此,我们不应该以本质上依赖于它的方式编写代码,例如不从我们的 .m/.h 文件中导入 UIKit.h 文件。

(另外,在我看来,如果您没有从.h.m 文件中正确导入适当的头文件,XCode4 的语法着色会变得混乱。)

【讨论】:

【参考方案2】:

为什么两者都有?

安全总比后悔好。可以禁用预编译的标头,并且由于 #import 不会导入任何内容两次,因此开销可以忽略不计。

【讨论】:

以上是关于为啥 Xcode 模板的 #imports 与 Prefix.pch 重复?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6 为啥 CLLocationManager 没有返回纬度和经度

为啥 Xcode 在创建类时会生成“不必要的”代码?

为啥找不到 Swift 4 语言的 Xcode 目标 c 接口标题名称

为啥 Xcode 自动补全在导入时会提示 .m 文件?

自定义 Xcode ViewController 类模板

模板:我需要更好地学习这些吗?为啥我会收到错误