据我所知,如果ClassA需要包含ClassB头,ClassB需要包含ClassA头,以避免任何循环包含,则应该使用前向类声明.我也知道#import是一个简单的ifndef,所以包含只发生一次.

我的问题是:何时使用#import,何时使用@class?有时,如果使用@class声明,我会看到一个常见的编译器警告,例如:

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

我真的很想理解这一点,而不是仅仅删除@class forward声明,然后抛出#import来消除编译器给我的警告.

推荐答案

如果您看到此警告:

警告:接收方"MyColClass"是转发类,相应的@interface可能不存在

您需要在文件中输入#import,但可以在实现文件(.m)中输入,并在头文件中使用@class声明.

@class并不(通常)消除对#import个文件的需求,它只是将需求向下移动到更接近信息有用的地方.

For Example

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

MyCoolClass *myObject;

除了MyCoolClass是一个有效类之外,它不必担心其他任何事情,它应该为指向它的指针(实际上,只是一个指针)预留空间.因此,在你的标题中,@class就足够90%的时间了.

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

Objective-c相关问答推荐

Objective-C:为什么[对象复制]的两个请求返回相同的结果?

Objective c 判断文本字段是否为空

Objective-C 对象的列表 Select 器

ios 使用 AVFramework 捕获图像

负数的奇怪 Objective-C Mod 行为

从 NSError 返回 NSString

xcode 未知类型名称

iOS - 应用程序关闭时的核心位置和地理围栏

NSString:从字符串中删除 UTF-8 重音的简单方法?

UITextView 禁用文本 Select

设置数据后调整 UICollectionView 单元格的大小

Lipo错误!!无法打开输入文件

如何在iphone的objective-c中以编程方式调整图像大小

当表格重新出现时,UITableView 不会自动取消 Select 选定的行

在我滚动之前,数据不会加载到 UITableView 中

在 UITextField 文本上投影

为什么 LLDB 不能打印 view.bounds?

UICollectionView 自动调整高度

如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?

如何在 Xcode 7 中启用_BITCODE?