【问题标题】:why use forward declaration rather than #import in .h file?为什么在.h 文件中使用前向声明而不是#import?
【发布时间】:2012-02-28 22:34:19
【问题描述】:

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

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

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

这一切都错了吗?

【问题讨论】:

  • @class vs. #import的可能重复
  • 好的 - 感谢所有回复。所以这是一个编译器优化 - 有意义

标签: objective-c ios


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的用例是有循环引用的地方。例如,AppDelegate 有一个 ViewController 实例的 ivar,出于某种原因,ViewController 也希望引用 AppDelegate(在 .h 中)。在这种情况下,我将仅在 AppDelegate 中使用#import,并在 ViewController 中使用前向声明。否则无法编译。

    【讨论】:

      【解决方案3】:

      它用于最小化依赖关系。当您的项目变大时,您对每个要编译的文件的导入将变成大量依赖项,因为一切都依赖于一切。这使得编译过程变得更慢,因为它必须读取和解析大量不必要的信息。

      【讨论】:

        【解决方案4】:

        关于推动 C 语言声明的历史问题及其子集Why are forward declarations necessary? 有一篇很好的文章

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-08
          • 2011-06-13
          • 2013-11-11
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          相关资源
          最近更新 更多