据我了解,如果 ClassA 需要包含 ClassB header ,而 ClassB 需要包含 ClassA header 以避免任何循环包含,则应该使用前向类声明。我也知道 #import
是一个简单的 ifndef
,因此包含只发生一次。
我的问题是:什么时候使用#import
,什么时候使用@class
?有时,如果我使用 @class
声明,我会看到常见的编译器警告,如下所示:
warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.
真的很想理解这一点,而不是仅仅删除 @class
前向声明并抛出 #import
以消除编译器给我的警告。
最佳答案
如果您看到此警告:
warning: receiver 'MyCoolClass' is a forward class and corresponding @interface may not exist
您需要 #import
文件,但您可以在实现文件 (.m) 中执行此操作,并在头文件中使用 @class
声明。
@class
不会(通常)删除对 #import
文件的需求,它只是将需求向下移动到更靠近信息有用的地方。
举例
如果你说 @class MyCoolClass
,编译器知道它可能会看到类似的内容:
MyCoolClass *myObject;
它不必担心除了 MyCoolClass
是一个有效的类之外的任何东西,它应该为指向它的指针保留空间(实际上,只是一个指针)。因此,在您的 header 中,@class
在 90% 的情况下就足够了。
但是,如果您需要创建或访问 myObject
的成员,则需要让编译器知道这些方法是什么。此时(可能在您的实现文件中),您需要#import "MyCoolClass.h"
,告诉编译器除了“这是一个类”之外的其他信息。
https://stackoverflow.com/questions/322597/