猿问

目标C:前瞻性声明

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


在MyAppDelegate标头中,我创建了一个RootViewController名为的实例rootViewController。我已经看到了将@class指令用作“转发类声明”的示例,但我不太确定这是什么意思或完成了什么。


#import <UIKit/UIKit.h>

@class RootViewController;

@interface MyAppDelegate

.

.

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


在MyAppDelegate标头中,我创建了一个RootViewController名为的实例rootViewController。我已经看到了将@class指令用作“转发类声明”的示例,但我不太确定这是什么意思或完成了什么。


#import <UIKit/UIKit.h>

@class RootViewController;

@interface MyAppDelegate

.

.

.


梦里花落0921
浏览 466回答 3
3回答

慕哥6287543

它基本上告诉编译器该类RootViewController存在,而没有指定其确切外观(即:其方法,属性等)。您可以使用它来编写包含RootViewController成员变量的代码,而不必包含完整的类声明。这在解析循环依赖项时特别有用-例如,其中say&nbsp;ClassA具有type的成员ClassB*,并且ClassB具有type的成员ClassA*。你需要已ClassB宣布之前,你可以使用它ClassA,但你也需要ClassA申报,然后才能在使用它ClassB。远期声明允许你通过说来克服这个ClassA是ClassB存在的,而不必实际指定ClassB's规格齐全。您倾向于发现很多前向声明的另一个原因是,有些人采用了前向声明类的约定,除非他们绝对必须包含完整的声明。我还没有完全记得,但是苹果可能会在Objective-C指导风格指南中建议这样做。继续我的上面的例子,如果你的声明ClassA,并ClassB在文件ClassA.h和ClassB.h分别,你需要#import哪一个利用其声明中的其他类。使用前向声明意味着您不需要#import,这会使代码更漂亮(特别是一旦您开始收集很多类,每个类都需要在其中使用#import),并通过最小化代码的数量来提高编译性能。编译任何给定文件时编译器需要考虑的代码。顺便说一句,尽管该问题仅与Objective-C中的前向声明有关,但是所有后续注释也同样适用于C和C ++(以及可能的许多其他语言)编码,这也支持前向声明并将其通常用于相同的目的。

叮当猫咪

前向声明主要是为了避免循环导入,即一个文件导入另一个文件,然后导入第一个文件,等等。基本上,当您导入文件时,在构建项目时,在导入时将替换文件的内容,然后将其馈入到编译器。如果您有循环导入,则将有一个永远不会编译的无限循环。幸运的是,xcode会在尝试之前告诉您有关此的信息。前向声明说:“不导入此类,只知道它存在。”如果没有导入或前向声明,则会出现一个错误,即不存在此类。
随时随地看视频慕课网APP
我要回答