为什么在.h文件中使用前向声明而不是#import?

时间:2012-02-07 13:40:30

标签: objective-c ios

我是初学的iOS / ObjectiveC编码器,我正在尝试理解一些细节,而不是愚蠢地遵循我看到的示例代码。

我想我在.h文件中得到了前向声明的要点:它告诉编译器指定的类是“稍后定义的播放器” - 然后将头文件导入.m文件中。 / p>

我不明白为什么不只是在引用类的头中导入类头,而不是使用前向声明?我对#import的理解是它不会多次导入标题(就像#include一样 - 这需要if_def的东西)。

我是否完全错了?

4 个答案:

答案 0 :(得分:4)

使用前向引用的一个原因是编译器速度。标头可能包含在许多其他文件中,这些文件可能不需要头文件中包含的定义。由于预处理器包含了包含的文件,因此包含大量包含或大量包含的文件会大大增加编译器必须处理的代码行。

您可以通过在Xcode中使用preprocess命令来查看预处理器的输出。通过在标头中正向声明类,您将删除头文件中包含的所有代码。

答案 1 :(得分:1)

我的用例是有循环引用的地方。例如,AppDelegate有一个ViewController实例的ivar,由于某种原因,ViewController也想要引用AppDelegate(在.h中)。在这种情况下,我只在AppDelegate中使用#import,在ViewController中使用forward声明。否则,它将无法编译。

答案 2 :(得分:0)

它用于最小化依赖性。当你的项目变大时,每个要编译的文件的导入都会变成一大堆依赖项,因为一切都依赖于所有东西。这使得编译过程变得更慢,因为它必须不必要地读取和解析大量信息。

答案 3 :(得分:0)

关于推动C中的前向声明的历史问题以及Why are forward declarations necessary?

的子集,有一篇很好的文章

长话短说 - 当内存有限时,这曾经是一个问题。如今它不那么重要,但可以帮助加快大型项目的编译速度。