OC中@class的理解

当我们再看苹果自己封装的类的时候,经常会看到@class XXX,我们知道@class XXX是告诉编译器有这样一个类,但是这个类里面有什么东西我们不知道。
一般来说,我们在使用某一个类时,即当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,有两种方法:

1.#import""    2 .   @class 

例如:
#import"B.h"

@interface A:NSObject

{

       B  *b;

}

@end;


那么这两种方法有什么不一样呢?一般来说他们有以下几点不一样:
1.#import 引用的类,会获取到这个类的所有信息,包括被引用类的所有变量和方法,但是通过@class 引用被引用类时,只知道有这样一个类,告诉编译器在A.h中 B *b只是类的声明,具体要实现什么方法,等实现文件真正用到是,才会真正查看B类中的小心。

2.使用@class方式由于只需要只要被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#import来包含被引用类的头文件;

3.通过上面两点也反映在编译效率上,假如有上百个头文件都#import 同一个文件,或者这个文件又#import 很多文件,那么编译起来会比较耗时,相对来说,@class不会出现这个问题

4.对于循环引用关系来说,A引用B,B又引用A,B类的代码

#import"A.h"

@interface B:NSObject

{

     A *a;

}


@end;


这样就会出现循环引用的问题。

当使用@class 在两个类中相互声明,则不会出现编译错误。


所以,为了编译效率,如果要在A.h 中声明B的对象,可以用@class B 来应用,而在A.m中#import B.



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值