【问题标题】:Objective-C: Forward Class DeclarationObjective-C:前向类声明
【发布时间】:2011-07-08 16:03:12
【问题描述】:

我正在编写一个多视图应用程序,它利用一个名为 RootViewController 的类在视图之间切换。

在我的MyAppDelegate 标头中,我创建了一个名为rootViewControllerRootViewController 实例。我见过这样的例子,其中@class 指令被用作“前向类声明”,但我不太确定这意味着什么或完成了什么。

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.

【问题讨论】:

  • 我的猜测是你没有“创建一个实例”,而是“声明一个指向的指针”。这是正确的吗?

标签: objective-c c-preprocessor forward-declaration


【解决方案1】:

它基本上告诉编译器类RootViewController 存在,但没有具体说明它的样子(即:它的方法、属性等)。您可以使用它来编写包含RootViewController 成员变量的代码,而不必包含完整的类声明。

这在解决循环依赖时特别有用 - 例如,ClassA 有一个 ClassB* 类型的成员,而ClassB 有一个 ClassA* 类型的成员。您需要声明 ClassB 才能在 ClassA 中使用它,但您还需要声明 ClassA 才能在 ClassB 中使用它。前向声明允许您通过告诉ClassA 存在ClassB 来克服这个问题,而无需实际指定ClassB's 完整规范。

您倾向于发现大量前向声明的另一个原因是有些人采用前向声明类的约定,除非它们绝对必须包含完整的声明。我不完全记得,但这可能是 Apple 在其 Objective-C 指导风格指南中推荐的内容。

继续我上面的示例,如果您的 ClassAClassB 声明分别在文件 ClassA.hClassB.h 中,则您需要 #import 中的任何一个才能在另一个类中使用其声明.使用前向声明意味着您不需要#import,这使代码更漂亮(特别是当您开始收集相当多的类时,每个类都需要一个`#import 在使用它的地方),并通过最小化来提高编译性能编译器在编译任何给定文件时需要考虑的代码量。

顺便说一句,虽然这个问题只与 Objective-C 中的前向声明有关,但所有进行中的 cmets 也同样适用于 C 和 C++(可能还有许多其他语言)的编码,它们也支持前向声明并且通常使用出于同样的目的。

【讨论】:

  • 所以,我想我很困惑为什么在 MyAppDelegate.h 中创建一个 RootViewController 对象是不够的。似乎是多余的,但我确信我错过了一些基本的东西。 ...编辑:啊;刚刚看到您的编辑。
  • 优秀。简洁。谢谢。
  • 转发声明类的一个原因是,如果 A 有一个指向 B 的指针,它具有指向 A 的指针。你不能从 B.h 导入 A.h 和从 A.h 导入 B.h,因为它是循环依赖。头文件中的前向声明负责这一点。 A.m 进口 B.h. B.m 进口 A.h.
  • @RogerWernersson:这不正是我的回答所说的吗?
  • 那么,我们可以在其他情况下使用@class 代替 import 吗?或者哪种情况绝对需要导入,而@class 无法完成?
【解决方案2】:

前向声明主要是为了避免循环导入,其中一个文件导入另一个文件,该文件导入第一个文件等。基本上,当您导入文件时,文件的内容在您构建项目时在导入点被替换,这然后将其馈送到编译器。如果你有循环导入,你就会有一个永远不会编译的无限循环。幸运的是,xcode 会在尝试之前告诉你这一点。前向声明说“不要导入这个类,只知道它存在。”没有导入或前向声明,你会得到一个错误,即不存在这样的类。

【讨论】:

    【解决方案3】:

    @classforward class declaration(不完整类型) - 告诉编译器这个类存在。在这种情况下,编译器了解类型内存布局——类大小、成员或方法。这就是为什么你只能通过引用和指针来定义类。

    优点:

    • 减少构建时间
    • 打破循环引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多