何时使用 #import 和 @class - iPhone
何时使用 #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日
如果您看到以下警告:
警告:接收方'MyCoolClass'是一个前向类,对应的@interface可能不存在。
您需要在实现文件(.m)中#import
该文件,并在头文件中使用@class
声明。
@class
通常不会消除#import
文件的需要,它只是将要求移到更接近所需信息的地方。
例如
如果您说@class MyCoolClass
,编译器知道它可能会看到像下面这样的内容:
MyCoolClass *myObject;
它不必担心除MyCoolClass
是一个有效的类外的任何内容,它只需要为它保留一个指针的位置。因此,在您的头文件中,@class
几乎90%的情况下已经足够了。
然而,如果您需要创建或访问myObject
的成员,您需要让编译器知道这些方法是什么。此时(presumably在您的实现文件中),您需要#import "MyCoolClass.h"
,向编译器提供除“这是一个类”外的其他信息。