我的理解是,如果ClassA需要包含ClassB头,ClassB需要包含ClassA头以避免任何循环包含,则应该使用前向类声明。我还了解到,#导入是一个简单的ifndef,因此包含只发生一次
我的问题是:什么时候使用#import,什么时候使用@class?有时,如果我使用@class声明,我会看到一个常见的编译器警告,如下所示:
警告:接收器'FooController'是转发类,相应的@interface可能不存在。
我真的很想理解这一点,而不是仅仅删除@class转发声明并抛出#import来消除编译器给我的警告
如果您看到此警告:
警告:接收器“MyColClass”是转发类,相应的@interface可能不存在
您需要#导入该文件,但您可以在实现文件(.m)中这样做,并在头文件中使用@class声明
@class通常不会消除导入文件的需要,它只是将需求向下移动到信息有用的地方
例如
如果您说@class mycolclass,编译器知道它可能会看到如下内容:
mycolclass*myObject;
它不必担心任何事情,除了mycolclass是一个有效的类之外,它应该为指向它的指针预留空间(实际上,只是一个指针)。因此,在头文件中,@class在90%的时间内就足够了
但是,如果需要创建或访问myObject的成员,则需要让编译器知道这些方法是什么。此时(可能在您的实现文件中),您需要#导入“mycolclass.h”,告诉编译器除了“这是一个类”之外的其他信息