@class和#import比较
@class和#import比较
我理解在ClassA需要包含ClassB头文件,而ClassB需要包含ClassA头文件时,应该使用前向类声明以避免任何循环包含的问题。我也知道,#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
您需要在实现文件(.m)中使用#import
导入文件,并在头文件中使用@class
声明。
@class
通常不会删除需要#import
文件的必要性,它只是将要求向下移动更接近信息有用处的地方。
例如
如果您使用@class MyCoolClass
,编译器就知道它可能会看到以下内容:
MyCoolClass *myObject;
它不必担心任何除MyCoolClass
是一个有效的类并且应该为它保留指针(实际上只是一个指针)以外的事情。因此,在您的头文件中,@class
在90%的情况下已经足够了。
但是,如果您需要创建或访问myObject
的成员,则需要让编译器知道这些方法是什么。此时(可能是在您的实现文件中),您需要#import "MyCoolClass.h"
,以告诉编译器更多的信息,而不仅仅是“这是一个类”。