objective-c - @class 与 #import

据我了解,如果 ClassA 需要包含 ClassB header ,而 ClassB 需要包含 ClassA header 以避免任何循环包含,则应该使用前向类声明。我也知道 #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

您需要 #import 文件,但您可以在实现文件 (.m) 中执行此操作,并在头文件中使用 @class 声明。

@class 不会(通常)删除对 #import 文件的需求,它只是将需求向下移动到更靠近信息有用的地方。

举例

如果你说 @class MyCoolClass,编译器知道它可能会看到类似的内容:

MyCoolClass *myObject;

它不必担心除了 MyCoolClass 是一个有效的类之外的任何东西,它应该为指向它的指针保留空间(实际上,只是一个指针)。因此,在您的 header 中,@class 在 90% 的情况下就足够了。

但是,如果您需要创建或访问 myObject 的成员,则需要让编译器知道这些方法是什么。此时(可能在您的实现文件中),您需要#import "MyCoolClass.h",告诉编译器除了“这是一个类”之外的其他信息。

https://stackoverflow.com/questions/322597/

相关文章:

ios - UITextView 中的占位符

objective-c - 如何将 NSString 转换为 NSNumber

objective-c - 在 Objective-C 中,我如何测试对象类型?

objective-c - 定位服务在 iOS 8 中不起作用

objective-c - @synthesize 与 @dynamic,有什么区别?

ios - 如何链接到应用商店中的应用

ios - 在 Objective-C 中通过 NSNotificationCenter 发送和接收

ios - 如何在 Objective-C 中测试字符串是否为空?

ios - UITableViewCell,在滑动时显示删除按钮

ios - NS前缀是什么意思?