参考文件
#include
-
#include是C中用来引用文件的关键字
-
#include <>: 通常是对系统库文件的引用,编译器会去系统文件目录下查找。
-
#include “xxx.h”: 通常是对自定义文件的引用,编译器首先会去用户目录下查找,然后再去安装目录查找,最后去系统文件目录查找。
-
使用#include容易引起的重复引用问题,即classA引用了classC,classB也引用了classC,而当classD同时引用classA,classB的时候就会报重复引用的错误。
#import
-
#include <> 、 #include “xxx.h” 与 #include <>、#include “xxx.h”相同。
-
#import的功能与#include差不多,但是可以解决头文件重复导入的问题,而#include会有重复导入头文件的问题, 所以在Objective-C中我们是经常使用#import。
@class
-
主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息。
#import与@class区别
1. import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
5.什么时候该用@class,什么时候需要用#import呢?
(1)一般如果有
继承关系
的用#import,如B是A的子类那么在B中声明A时用#import。
(2)如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现. @class指令只是告诉编译器,这是个类,保留个空间来存放指针就可以了。
(3)还有就是自定义代理的时候,如果在头文件中想声明遵循代理,遵循协议的时候应该用#import导入文件,不然的话会出错误。
(4)使用有
Category
的类,要在.h头文件里用#import把Category包含进来。
总结:
1.能使用#import的地方就不要使用#inlclude
2.使用#import不管你对一个文件同时包含了多少次,最终只会包含一次
3.在头文件中如果没有用到包含类的实现方法,只需要知道它是一个类时,就应该使用@class,而不是#import。如果需要使用类的一些方法时,则需要使用#import。
4.能使用@class的地方就不要使用#import
网友评论