小编典典

@class 与 #import

all

据我了解,如果 ClassA 需要包含 ClassB 标头,而 ClassB 需要包含 ClassA 标头以避免任何循环包含,则应该使用前向类声明。我也明白
an#import很简单ifndef,因此包含只发生一次。

我的询问是这样的:什么时候使用#import,什么时候使用@class?有时,如果我使用@class声明,我会看到常见的编译器警告,如下所示:

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

真的很想理解这一点,而不是仅仅删除@class前向声明并投入#import以使编译器给我的警告静音。


阅读 79

收藏
2022-03-03

共1个答案

小编典典

如果您看到此警告:

警告:接收器“MyCoolClass”是一个转发类,对应的@interface 可能不存在

您需要#import该文件,但您可以在实现文件 (.m) 中执行此操作,并使用@class头文件中的声明。

@class不会(通常)消除对#import文件的需求,它只是将需求向下移动到更靠近信息有用的地方。

例如

如果你说@class MyCoolClass,编译器知道它可能会看到如下内容:

MyCoolClass *myObject;

除了是一个有效的类之外,它不必担心任何事情MyCoolClass,它应该为指向它的指针保留空间(实际上,只是一个指针)。因此,在您的标题中,@class90%
的时间就足够了。

但是,如果您需要创建或访问myObject的成员,则需要让编译器知道这些方法是什么。此时(可能在您的实现文件中),您需要#import "MyCoolClass.h", 告诉编译器除了“这是一个类”之外的其他信息。

2022-03-03