何时使用 #import 和 @class - iPhone

21 浏览
0 Comments

何时使用 #import 和 @class - iPhone

我理解的是,如果ClassA需要包含一个ClassB头文件,而ClassB需要包含ClassA头文件以避免循环包含,那么应该使用一个前向声明。

我也明白,#import 是一个简单的 ifndef,以便只包含一次。

我的问题是:什么时候使用 #import,什么时候使用 @class?有时候,如果我使用 @class 声明,我会看到一个常见的编译器警告,例如下面的:

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

我真的想理解这个问题,而不仅仅是删除 @class 前向声明并把一个 #import 放进去,以消除编译器给我的警告。

admin 更改状态以发布 2023年5月23日
0
0 Comments

三条简单的规则:

  • 只在头文件(.h 文件)中使用 #import 导入超类和所采用的协议。
  • 在实现文件(.m 文件)中导入所发送消息的所有类和协议。
  • 对于其它所有内容使用前向声明。

如果在实现文件中使用前向声明,则可能出现错误。

0
0 Comments

如果您看到以下警告:

警告:接收方'MyCoolClass'是一个前向类,对应的@interface可能不存在。

您需要在实现文件(.m)中#import该文件,并在头文件中使用@class声明。

@class通常不会消除#import文件的需要,它只是将要求移到更接近所需信息的地方。

例如

如果您说@class MyCoolClass,编译器知道它可能会看到像下面这样的内容:

MyCoolClass *myObject;

它不必担心除MyCoolClass是一个有效的类外的任何内容,它只需要为它保留一个指针的位置。因此,在您的头文件中,@class几乎90%的情况下已经足够了。

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

0