Objective-C:前瞻性宣言

Old*_*her 47 objective-c forward-declaration c-preprocessor

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

在我的MyAppDelegate标题中,我创建了一个被RootViewController调用的实例rootViewController.我已经看过这样的例子,其中@class指令被用作"前向类声明",但我不太确定这意味着什么或完成了什么.

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
Run Code Online (Sandbox Code Playgroud)

Mac*_*Mac 101

它基本上告诉编译器该类RootViewController存在,而不指定它究竟是什么样的(即:它的方法,属性等).您可以使用它来编写包含RootViewController成员变量的代码,而不必包含完整的类声明.

这在解析循环依赖关系时特别有用 - 例如,where ClassA具有类型的成员ClassB*,并且ClassB具有类型的成员ClassA*.您需要ClassB在使用之前声明ClassA,但是ClassA在使用之前还需要声明ClassB.前向声明允许您通过ClassA说明ClassB存在来克服这一点,而无需实际指定ClassB's完整的规范.

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

继续我的上面的例子,如果你的声明ClassA,并ClassB在文件ClassA.hClassB.h分别,你需要#import哪一个利用其声明中的其他类.使用前向声明意味着你不需要#import,这使代码更漂亮(特别是一旦你开始收集很多类,每个类都需要一个`#import使用它),并通过最小化数量来增加编译性能编译任何给定文件时编译器需要考虑的代码.

顺便说一下,虽然这个问题仅涉及Objective-C中的前向声明,但所有上述注释也同样适用于C和C++(可能还有许多其他语言)中的编码,这些编码也支持前向声明,通常用于相同的目的.

  • 转发声明类的一个原因是,如果A有一个指向B的指针,它有一个指向A的指针.你不能从Ah中从Bh AND Bh导入Ah,因为它是一个循环依赖.头文件中的前向声明负责处理.我进口BhBm进口啊 (9认同)
  • @RogerWernersson:这不完全是我的回答吗? (6认同)