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