@class与#import

@class与#import

据我理解,在ClassA需要包含ClassB头的事件中,应该使用前向类声明,而ClassB需要包含ClassA头,以避免任何循环包含。我也知道#import是一个简单的ifndef所以包含只发生一次。

我的询问是:什么时候使用?#import什么时候才能使用@class?有时如果我用@class声明中,我看到一个常见的编译器警告,如下所示:

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

很想了解这一点,而不是仅仅删除@class向前声明并抛出#import来压制编译器给我的警告。


慕哥6287543
浏览 463回答 3
3回答

慕妹3146593

如果您看到此警告:警告:接收器‘MyCoolClass’是一个前向类,可能不存在相应的@接口你需要#import文件,但是可以在实现文件(.m)中这样做,并使用@class在头文件中声明。@class不会(通常)消除#import文件,它只是将需求向下移动到信息有用的地方。例如如果你说@class MyCoolClass,编译器知道它可能会看到如下内容:MyCoolClass *myObject;它不需要担心任何事情,除了MyCoolClass是一个有效的类,它应该为指向它的指针预留空间(实际上,只是一个指针)。因此,在你的标题中,@class就够90%的时间了。但是,如果您需要创建或访问myObject作为成员,您需要让编译器知道这些方法是什么。#import "MyCoolClass.h",告诉编译器更多的信息,而不仅仅是“这是一个类”。

繁星点点滴滴

三个简单的规则:只#import超类和采用的协议,在头文件(.h档案)。#import在实现中向所有类和协议发送消息(.m档案)。其他一切的前向声明。如果您在实现文件中进行前向声明,那么您可能做错了什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS