Objective-C:前瞻性宣言

时间:2011-03-04 08:44:39

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

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

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

rootViewController

3 个答案:

答案 0 :(得分:100)

它基本上告诉编译器类RootViewController存在,而没有指定它的确切含义(即:它的方法,属性等)。您可以使用它来编写包含RootViewController成员变量的代码,而无需包含完整的类声明。

这在解决循环依赖关系时特别有用 - 例如,其中说ClassA的成员类型为ClassB*,而ClassB的成员类型为ClassA*。您需要先ClassB声明ClassA,然后才能在ClassA中使用它,但您还需要ClassB声明才能在ClassA中使用它。前向声明允许您通过向ClassBClassB's存在来解决此问题,而无需实际指定ClassA完整规范。

你倾向于找到许多前瞻性声明的另一个原因是有些人采用了向前宣布类的约定,除非他们绝对必须包含完整的声明。我不完全记得,但可能这是Apple推荐的Objective-C指导风格指南。

继续上面的示例,如果ClassBClassA.h的声明分别位于ClassB.h#import文件中,则需要#import无论哪一个在其他类中使用它的声明。使用前向声明意味着你不需要{{1}},这使得代码更漂亮(特别是一旦你开始收集很多类,每个类都需要一个`#import使用它),并提高编译性能通过最小化编译任何给定文件时编译器需要考虑的代码量。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

forward class declaration(不完整类型)只是告诉编译器该类存在。在这种情况下,编译器对类型内存布局一无所知-类大小,成员或方法。这就是为什么您只能用于通过引用和指针定义类的原因。

优势:

  • 减少构建时间
  • 中断循环引用
相关问题