据我所知,如果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相关问答推荐

UIImageView 并不总是为模板图像着色

在 Objective-C 中前向声明枚举

删除 UITableView 分隔线

Xcode 7.3 无法使用手动引用计数在文件中创建 __weak 引用

iOS8:退出应用程序后不久出现蓝条“正在使用您的位置”

为什么 requestWhenInUseAuthorization 不提示用户访问该位置?

如何在情节提要场景中嵌入自定义视图 xib?

Xcode 在 iOS 8 中的 Main() 中引发异常,并带有“所有异常”断点

Electron邮件镇静 iOS 8

自构建预编译头后文件已被修改

只有 ONE VIEW 横向模式

registerForRemoteNotificationTypes:iOS 8.0 及更高版本不支持

dyld:找不到符号:try 运行 iOS 应用程序时的 _NSURLAuthenticationMethodClientCertificate

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

在 iOS 7 上,如果最终包含在选项卡栏控制器中,则使用工具栏推送控制器会留下不可用空间的间隙

当单元格全屏时,为什么 UICollectionView 会记录错误?

有没有办法更新单个 UITableViewCell 的高度,而无需重新计算每个单元格的高度?

有没有办法在不使用 UINavigationController 的情况下更改 Storyboard 中 UINavigationBar 的高度?

为什么我的 UIButton 的“内部修饰”事件没有被调用?

UICollectionView 自动调整高度