#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的变量或者函数呢?
所以面对多重继承多重引用的时候我们一定要小心使用。

#include、#import与@class的使用与头文件循环引用问题的更多相关文章

  1. c++ 头文件循环引用解法

    A.h #include "B.h" class A{ public: B* m_b; } B.h #include "A.h" class B{ public ...

  2. 关于OC头文件互相引用的问题

    在OC中头文件互相引用是很常见的一件事,如: A的头文件#import "B.h" 而B的头文件#import "A.h" 这个时候就会出现意想不到的问题.系统 ...

  3. c++头文件重复引用问题

    引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include " ...

  4. [UE4]头文件循环依赖C++

    有2个类:aaa和bbb. aaa.h已经#include了bbb.h,则bbb.h就不能#include aaa.h,但bbb.cpp可以#include aaa.h bbb.h已经#include ...

  5. 关于Cocos2d-x头文件的引用

    cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprit ...

  6. clion中资源文件以及头文件的引用

    首先在使用clion中没有将文件target就会出现下面的错误  在使用的时候可以默认一下  在以后的使用中如果不需要某个文件时  就可以在CMakeLis.txt文件把它删除掉 在代码界面的最上面出 ...

  7. #include #import @class 的一些用法区别

    从网上查了一些资料,整理了一下,发现很多都说的比较详尽,下面摘录自网络 说一下#import同class之间的区别 在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明 ...

  8. 【转】#include,#import,@class的区别

    #include         #include  <>    :用于对系统文件的引用,编译器会在系统文件目录下去查找该文件.           #include "xx.h ...

  9. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

随机推荐

  1. GCC 中的编译器堆栈保护技术

    GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...

  2. Mac上查看隐藏文件夹/文件

    一.查看隐藏文件夹: 可以直接在终端执行 open ~/文件夹名称 如: open ~/.ssh 二.查看隐藏文件: 在Finder下进入你想要操作的文件夹,按快捷键Command + F 调出搜索窗 ...

  3. 解决ajax的parsererror错误的终极办法(后台传给前台的数据json问题)

    解决ajax的parsererror错误的终极办法(后台传给前台的数据json问题) 出现这个问题的原因是因为后台传给前台的数据出现了问题,ajax对于json的格式特别的严格 下面是会出现这个问题的 ...

  4. _1Python简介 安装及版本检测

    简介 Python是一种面向对象的解释性计算机程序设计语言,由荷兰人Guido von Rossum于1988年的圣诞节发明,第一个公开发行版于1991年. Python崇尚优美.清晰.简单,是一个优 ...

  5. 01_Python简介

    Python 简介 *为什么学习python http://bbs.fishc.com/thread-35584-1-1.html Python 特点 易于学习:Python有相对较少的关键字,结构简 ...

  6. Cocos2D-X屏幕适配新解

    ”   阅读器 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 Cocos2D-X(当前稳定版:2.0.4) 中,提供了相应的解决方案,以方便我们在设计游戏时,能够更好的适应不同的环境.   而 ...

  7. RAC(ReactiveCocoa)使用方法(一)

    RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 什么是RAC? 最近回顾了一下ReactiveCocoa的方法,也看了一些人的文章,现写篇文章总 ...

  8. head first python菜鸟学习笔记(第七章) ——web应用之为数据建模

    问题1. #意思是从athletelist.py中导入AthleteListfrom athletelist import AthleteList 源程序代码 import pickle from a ...

  9. 邻里街坊 golang入坑系列

    如果要追新或者怀旧,就点击https://andy-zhangtao.gitbooks.io/golang/content/ . 博客园里面的文章基本和gitbook上面是保持同步的. 这几天看了几集 ...

  10. c#游戏进程杀手

    我认为写博客还是比较重要的,特别是短时间写出一个含有新知识点的软件.这样总结下这次编程经验和再捋顺一下这次编程思路.首先来谈谈为什么想做这个小程序,一是感觉自己太贪玩想控制一下,二是也锻炼下自己的编程 ...