为了账号安全,请及时绑定邮箱和手机立即绑定

@class与#import

@class与#import

iOS
慕哥6287543 2019-06-09 15:43:48
@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来压制编译器给我的警告。
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

如果您看到此警告:

警告:接收器‘MyCoolClass’是一个前向类,可能不存在相应的@接口

你需要#import文件,但是可以在实现文件(.m)中这样做,并使用@class在头文件中声明。

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

例如

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

MyCoolClass *myObject;

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

但是,如果您需要创建或访问myObject作为成员,您需要让编译器知道这些方法是什么。#import "MyCoolClass.h",告诉编译器更多的信息,而不仅仅是“这是一个类”。


查看完整回答
反对 回复 2019-06-09
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

三个简单的规则:

  • #import

    超类和采用的协议,在头文件(

    .h

    档案)。
  • #import

    在实现中向所有类和协议发送消息(

    .m

    档案)。
  • 其他一切的前向声明。

如果您在实现文件中进行前向声明,那么您可能做错了什么。


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 459 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信