据我了解,如果ClassA需要包括ClassB header ,而ClassB需要包括ClassA header ,以避免任何循环包含,则应使用前向类声明。我也知道#import
是一个简单的ifndef
,因此一个include仅发生一次。
我的询问是:什么时候使用#import
?什么时候使用@class
?有时,如果我使用@class
声明,则会看到常见的编译器警告,例如:
真的很想了解这一点,而不是仅仅删除@class
前向声明并扔进#import
来使编译器发出的警告静音。
最佳答案
如果看到此警告:
您需要对文件进行#import
,但可以在实现文件(.m)中进行操作,并在头文件中使用@class
声明。@class
通常不会删除对#import
文件的需要,它只是将需求移到了信息有用的地方。
例如
如果您说@class MyCoolClass
,则编译器知道它可能会看到类似以下内容的内容:
MyCoolClass *myObject;
除了
MyCoolClass
是有效的类之外,它不必担心其他任何事情,它应该为指向它的指针(实际上只是一个指针)保留空间。因此,在标题中,@class
足以满足90%的时间要求。但是,如果您需要创建或访问
myObject
的成员,则需要让编译器知道这些方法是什么。此时(大概在您的实现文件中),您需要使用#import "MyCoolClass.h"
,以告知编译器除“这是一个类”之外的其他信息。关于objective-c - @class与#import,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1295863/