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

在我的MyAppDelegate标题中,我创建了RootViewController的一个名为rootViewController的实例.我见过@class指令被用作"前向类声明"的例子,但我不太确定这意味着什么或实现了什么.

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

推荐答案

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

这在解决循环依赖关系时特别有用——例如,假设ClassA有一个ClassB*类型的成员,而ClassB有一个ClassA*类型的成员.你需要先声明ClassB,然后才能在ClassA中使用它,但你也需要声明ClassA,然后才能在ClassB中使用它.转发声明允许您通过告诉ClassA存在ClassB来克服这一问题,而不必实际指定ClassB's完整的规范.

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

继续我上面的例子,如果ClassAClassB的声明分别在文件ClassA.hClassB.h中,那么需要在另一个类中使用它的声明.使用前向声明意味着您不需要#import,这使得代码更漂亮(特别是一旦您开始收集相当多的类时,每一个类都需要在使用它的时候输入一个‘输入’),并且通过编译编译器在编译任何给定文件时需要考虑的代码量来增加编译性能.

另外,尽管问题只涉及Objto-C中的前向声明,但所有的过程注释同样适用于C和C++(以及可能许多其他语言)中的编码,它们也支持正向声明,并且通常使用它来实现相同的目的.

Objective-c相关问答推荐

启动 Finder 窗口并 Select 特定文件

如何判断特定的 ViewController 视图当前是否可见?

如何将日期字符串解析为 iOS 中的 NSDate 对象?

如何在 iOS 上将图像旋转 90 度?

iPhone - 时区便利方法之间的差异

访问当前视图的父视图 - iOS

在 Objective C 中使用 extern

在 Objective-C 中,你在哪里声明一个常量?

如何推送两个视图控制器但只为第二个设置动画过渡?

-[MyClassName copyWithZone:] 无法识别的 Select 器发送到实例

如何为 iPhone 应用程序创建多个主题/皮肤?

Objective-C 异常

在objective c中以自定义格式获取当前时间

NSString 中子字符串的出现次数?

iPhone:如何确定线程是否是主线程?

将自定义子视图(在 xib 中创建)添加到视图控制器的视图 - 我在做什么错

即使在静音模式下也能在 iPhone 上播放声音

Block 隐式保留'self';明确提及touch以表明这是预期行为

CALayer:仅在一侧添加边框

iOS中的活动生命周期相当于什么?