它基本上告诉编译器类RootViewController
存在,但没有指定它的确切外观(即:它的方法、属性等).您可以使用它来编写包含RootViewController
个成员变量的代码,而不必包含完整的类声明.
这在解决循环依赖关系时特别有用——例如,假设ClassA
有一个ClassB*
类型的成员,而ClassB
有一个ClassA*
类型的成员.你需要先声明ClassB
,然后才能在ClassA
中使用它,但你也需要声明ClassA
,然后才能在ClassB
中使用它.转发声明允许您通过告诉ClassA
存在ClassB
来克服这一问题,而不必实际指定ClassB's
完整的规范.
另一个你倾向于发现大量向前声明的原因是,有些人采用向前声明类的约定,除非它们绝对必须包含完整的声明.我不完全记得了,但这可能是苹果在其Objective-C指导风格指南中推荐的东西.
继续我上面的例子,如果ClassA
和ClassB
的声明分别在文件ClassA.h
和ClassB.h
中,那么需要在另一个类中使用它的声明.使用前向声明意味着您不需要#import
,这使得代码更漂亮(特别是一旦您开始收集相当多的类时,每一个类都需要在使用它的时候输入一个‘输入’),并且通过编译编译器在编译任何给定文件时需要考虑的代码量来增加编译性能.
另外,尽管问题只涉及Objto-C中的前向声明,但所有的过程注释同样适用于C和C++(以及可能许多其他语言)中的编码,它们也支持正向声明,并且通常使用它来实现相同的目的.