为什么在.h文件中使用前向声明而不是#import?

我是一个初学者iOS / ObjectiveC编码器,并试图了解一些细节,而不是只是愚蠢地遵循我看到的示例代码。

我想我在.h文件中得到了一个前向声明的要点:它告诉编译器指定的类是“稍后定义的播放器”,然后将头导入到.m文件中。

我不明白的是为什么不只是在引用类的头文件中导入类头,而不是使用前向声明? 我对#import的理解是它不会多次导入头文件(就像#include – 这需要if_def的东西)。

我有这个错吗?

使用前向引用的一个原因是编译速度。 头文件可能包含在许多其他文件中,这些文件可能不需要包含在头文件中的定义。 由于预处理程序包含了包含的文件,因此包含大量包含文件或大量包含文件可能会大大增加编译器必须处理的代码行数量。

你可以通过在Xcode中使用预处理命令来查看预处理器的输出。 通过在头文件中转发声明类,您将删除头文件中包含的所有代码。

我的用例是有循环引用的地方。 例如,AppDelegate具有一个ViewController实例的ivar,由于某种原因,ViewController也想引用AppDelegate(在.h中)。 在这种情况下,我只会在AppDelegate中使用#import ,并在ViewController中转发声明。 否则,它不会编译。

它被用来最小化依赖。 当你的项目变大的时候,每个要编译的文件的导入都会变成大量的依赖项,因为一切都依赖于一切。 这使得编译过程要慢得多,因为它必须不必要地读取和parsing大量的信息。

关于推进C语言中的声明的历史问题有一个很好的写法,它是为什么前向声明是必要的?

长话短说 – 当内存有限时,这往往是更多的问题。 如今它不那么重要,但可以帮助加快在大型项目中的编译速度。