据我了解,如果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/

10-13 04:00
查看更多