#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的变量或者函数呢?
所以面对多重继承多重引用的时候我们一定要小心使用。
#include、#import与@class的使用与头文件循环引用问题的更多相关文章
- c++ 头文件循环引用解法
A.h #include "B.h" class A{ public: B* m_b; } B.h #include "A.h" class B{ public ...
- 关于OC头文件互相引用的问题
在OC中头文件互相引用是很常见的一件事,如: A的头文件#import "B.h" 而B的头文件#import "A.h" 这个时候就会出现意想不到的问题.系统 ...
- c++头文件重复引用问题
引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include " ...
- [UE4]头文件循环依赖C++
有2个类:aaa和bbb. aaa.h已经#include了bbb.h,则bbb.h就不能#include aaa.h,但bbb.cpp可以#include aaa.h bbb.h已经#include ...
- 关于Cocos2d-x头文件的引用
cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprit ...
- clion中资源文件以及头文件的引用
首先在使用clion中没有将文件target就会出现下面的错误 在使用的时候可以默认一下 在以后的使用中如果不需要某个文件时 就可以在CMakeLis.txt文件把它删除掉 在代码界面的最上面出 ...
- #include #import @class 的一些用法区别
从网上查了一些资料,整理了一下,发现很多都说的比较详尽,下面摘录自网络 说一下#import同class之间的区别 在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明 ...
- 【转】#include,#import,@class的区别
#include #include <> :用于对系统文件的引用,编译器会在系统文件目录下去查找该文件. #include "xx.h ...
- 在头文件中声明class 类 与 include类所在的头文件区别---理解
在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...
随机推荐
- Ajax之路
第一部分: Ajax全称Asynchronous Javascript and XML,中文意思为"异步的Javascript 和XML".Ajax这组技术是web2.0的核心之一 ...
- Oracle与Sql server的区别
一直搞不明白Oracle数据库和sql server的区别,今天我特意查资料把他们的区别整理出来 Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle. ...
- web前端-----第一弹html
HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...
- 编程语言 : Java的动态Web解决方案泛谈
文章概述 最近发现很久前一股脑地学习框架,发觉越发迷糊.知道了框架只是暂时的,重点是基础的技术.该文大篇幅回顾Servlet技术栈和简要的MVC框架. 至于为什么学J2EE,额,大家都用框架,可框架也 ...
- spring aop使用
最近做一个数据库分离的功能,其中用到了spring aop,主要思路就是在service层的方法执行前根据注解(当然也可以根据方法名称,如果方法名称写的比较统一的话)来判断具体使用哪个库.所以想着再回 ...
- mysql数据库常用命令笔记
连接数据库:mysql -h localhost -u root -p 000000 退出:exit; \q; quit; SET foreign_key_checks = 0; 禁用外键 ...
- 如何实现MDI窗体不重复打开同一个子窗体?
使用MDI窗体时,默认是可以多次打开同一个子窗体的,那么如何控制不重复打开同一个子窗体呢?MDI窗体有个重要属性——MdiChildren,该属性表示MDI窗体打开的子窗体的数组,循环遍历该数组,可以 ...
- 安卓自定义控件(一)Canvas、Paint、Shader、Xfermode
关于自定义控件,之前就写过一篇自定义控件,上图下字的Button,图片任意指定大小,但是使用效果还是让人感觉不幸福,这次索性彻彻底底地对自定义控件做一次彻彻底底的总结. 我会花4篇博客来介绍自定义控件 ...
- php代码中的细节问题
本次主要谈及工作中关于注销功能中的路径设置及session的清除问题之前的调试一直忽略了session的功能,以至于每次使用__ROOT__/index.php/home/Student/logout ...
- 2017最新PHP经典面试题目汇总(上篇)
1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...