#import与@class区别
2015-08-22 19:47
260 查看
#import 与@class区别在于:
1.#import会链入该头文件的所有信息,包括实例变量和方法;而@class只是告诉编译器,其后声明的名称是类的名称,至于这些类是如何定义的,不用考虑。
2.在头文件中,一般不需要对被引入的类的内部进行操作,只是知道类的名称就可以了,所以在头文件中一般使用@class来声明这个名称是类的名称。在实现文件里面,因为会用到这个引入类的内部的实例变量和方法,所以需要#import 来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
例如:
在ClassA.h中#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。
如果只是 ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的.m文件中 #import ClassB.h
4.循依赖关系:A->B,B->A这样的依赖关系,如果使用#import来相互包含,就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误。例如:
在头文件相互#import对方的头文件,出现循环包含,报错!
使用@class就不会出现错误。
![](http://img.blog.csdn.net/20150822194608988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150822194916317?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
若实现文件需要使用对方的内部类方法,则在实现文件引入头文件即可:实现文件中相互引入是不会出现错误的。
![](http://img.blog.csdn.net/20150822200144917?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150822200156729?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
总结:
头文件里面只#import超类 消息文件里面#import需要发消息过去的类 其他地方就用@class转向声明
还有另一种情况,使用有Categories的类,要在.h头文件里用#import把Categories包含进来
1.#import会链入该头文件的所有信息,包括实例变量和方法;而@class只是告诉编译器,其后声明的名称是类的名称,至于这些类是如何定义的,不用考虑。
2.在头文件中,一般不需要对被引入的类的内部进行操作,只是知道类的名称就可以了,所以在头文件中一般使用@class来声明这个名称是类的名称。在实现文件里面,因为会用到这个引入类的内部的实例变量和方法,所以需要#import 来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
例如:
在ClassA.h中#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。
如果只是 ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的.m文件中 #import ClassB.h
4.循依赖关系:A->B,B->A这样的依赖关系,如果使用#import来相互包含,就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误。例如:
在头文件相互#import对方的头文件,出现循环包含,报错!
使用@class就不会出现错误。
若实现文件需要使用对方的内部类方法,则在实现文件引入头文件即可:实现文件中相互引入是不会出现错误的。
总结:
头文件里面只#import超类 消息文件里面#import需要发消息过去的类 其他地方就用@class转向声明
还有另一种情况,使用有Categories的类,要在.h头文件里用#import把Categories包含进来
相关文章推荐
- 哈希表及处理冲突的方法
- struts/Servlet,action转到jsp后,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)
- 数据结构-二叉树实现
- scrollView 笔记
- 第六章 Hyper-V 2012 R2 的检查点
- HDU 1034.Candy Sharing Game【又是模拟】【8月22】
- 使用cxf3.0.4搭建webservice服务需要的最精简jar包
- 笔试题&面试题:输入一个维度,逆时针打印出一个指定矩阵
- 人生的第一个博客(●'◡'●)ノ♥--开博典礼
- POJ3104--Drying
- MySQL必知必会(使用函数处理数据)
- Matlab之视角旋转函数
- 笔记本光驱位换SSD固态硬盘之硬盘格式化
- Spring jar下载地址:
- java并发编程---volatile
- hdu 1004 Let the Balloon Rise(字典树)
- sturt1 submit 提交在后台回去不到表单的值,是否加了disabled="true "属性?
- hdu1532网络流
- 下载apk到本地,安装遇到的解析包时出现错误的分析
- Spring揭秘 读书笔记 四----方法注入