#include、#import与@class的使用与头文件循环引用问题

#include

  • #include <>:通常是对系统库文件的引用,编译器会去系统文件目录下查找。
  • #include “xxx.h”:通常是对自定义文件的引用,编译器首先会去用户目录下查找,然后再去安装目录查找,最后去系统文件目录查找。

#import

  • #import的功能与#include差不多,但是可以解决头文件重复导入的问题,而#include会有重复导入头文件的问题,
    比如class文件A、B都引用了class C,如果class D引用了class A、B,这时候就会报重复引用的错误,因为相当于class D引用了两次class C。所以在Objective-C中我们是经常使用#import。

@class

  • 这个又什么时候会使用呢?经常是用来解决头文件循环引用的问题,因为#import “xxx.h” 是相当于把头文件复制到另一个头文件。在某些情况下,比如:
    class A.h使用了#import "B.h"
    class B.h使用了#import "A.h"
循环引用问题:

那么这就会导致了头文件循环引用的问题了,通常都是出现虽然你导入了该头文件,但在使用时比如使用@propery(nonatomic)A *a;会出现:
Unknown Type 之类错误. 所以这个时候@class就派上用场了。

解决方案:

在class A中不用做改变,在class B.h中使用@class A替换#import "A.h"。@class的作用只是跟头文件说明有这个文件,你可以定义这个类型的属性,然后我们在实现B.m文件再使用#import "A.h"即可使用class A中定义的所有函数与属性。这就解决了循环引用的问题。

总结:

很多情况出现头文件循环引用的问题不是这样简单的情况,有时候会因为多重继承和多重引用而使情况显得很复杂。比如:

  class A 继承 class B
->class B 继承 class C
->class C 继承 class D
  class D 中#improt "F.h"
->class F 继承了 class E
  class E 中#improy "A.h"
  ...
这时候class D与class E就出现了循环应用头文件的问题。但你说好吧这个简单,class D或者E中某一个使用个@class不就解决了。
假如让D使用@class。但是如果D需要使用到E的变量或者函数呢?
所以面对多重继承多重引用的时候我们一定要小心使用。       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值