@class 与#import的关系

问题

根据我的理解,在ClassA需要包含ClassB的头文件同时ClassB需要包含ClassA的头文件的情况下,为了避免任何循环引用,应该使用forward-class声明。#import本质就是一个简单的#ifndef,因此引用头文件只会出现一次。

问题是:我们何时该使用#import何时使用@class,有时在使用@class的情况下,会出现编译器警告,信息如下:

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

分析

如果你看到如下警告信息:

warning: receiver ‘MyCoolClass’ is a forward class and corresponding @interface may not exist

说明你需要使用#import导入文件,但是你可以在实现文件(.m)中使用#import,头文件中使用@class这样的方式实现。

@class通常不是为了替代#import,它只是将需求转移到信息更有价值的地方。

比如:

示例

如果使用@class MyCoolClass,编译器就会知道如下信息:

MyCoolClass *myObject;	

除了关注MyCoolClass是一个可用的类,无需担心其他任何东西,它应该为指向它的指针预留空间(实际上,只是一个指针)。

因此,在头文件中,@class满足了90%的需求。

然而,如果你需要创建或者访问myObject的一个方法或者属性,你将需要让编译器知道那些方法是什么。此时,你需要在(实现文件).m文件中使用#import "MyCoolClass.h",告诉编译器除了这是个类之外的其他额外信息。

总结

前置声明仅仅告诉编译器:“嗨,我知道我声明的这个家伙你不认识,但是当我使用@MyClass声明它后,我承诺我稍后将会在实现文件(.m)#import它。”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarlen John

谢谢你给我一杯咖啡的温暖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值