1. #include
#include是C/C++中引用文件的预处理指令。
#include的作用就是把引用的文件中所有内容将#include给替换,就像你把引用的文件中所有内容拷贝覆盖到#include那一行。
2. #import
//导入系统头文件使用 < >
#import <UIKit/UIKit.h>
//导入自定义头文件使用 " "
#import "ViewController.h"
#import是objective-C中引用文件的预处理指令。
#import的作用大致和#include相同,但#import相较于#include而言,#import可以防止文件“重复导入”。
什么是重复导入?
A.h中导入了D.h,B.h也导入了D.h,当C.h既导入A.h又导入B.h的时候,C.h中就会重复导入D.h。
而#import确定一个文件中只能导入另一个文件一次,因此#import可以防止文件重复导入。
3. @class
//声明一个类
@class ViewController;
//一次声明多个类
@class ViewController, MyView, MYBookModel;
@class关键字只是告诉编译器这是一个类的名称,至于这个类是如何定义和实现的,它并不关心。
也就是说@class并不会像#import那样导入该类的文件内容,所以使用@class可以提升编译性能。
一般在.h中只需要知道被引用类的名称就可以了,不需要被引用类的定义和实现,所以在.h中通常使用@class导入类即可。
而且在.h中使用@class代替#import,可以避免在.h中使用#import可能会导致的一种编译错误“循环依赖”。
什么是循环依赖?
A.h中导入了B.h,同时在A.h中定义如下属性:
@property(nonatomic, strong) B *b;
而B.h又导入了A.h,此时就会形成循环依赖,出现编译错误。
但如果A.h中仅仅只是导入了B.h,并没有定义上面的那条属性,B.h也仅仅只是导入了A.h,那么这样只是形成“循环导入”并不会出现编译错误,A.h要使用B.h(或B.h使用A.h)形成“依赖”才会出现编译错误。
4. @import
@import用于引用苹果自己的框架。
@import的具体特性在这就不介绍了,Xcode默认开启该特性,因此编译器在编译时会自动把引用系统框架的#import映射为@import。
区别在于:@import只能引用苹果自己的框架,而#import还可以引用第三方框架和自定义文件。
在实际项目中我们导入大多数文件是第三方框架和自定义文件,所以为了保持代码一致性,所以会全部使用#import而不会使用@import。
@import UIKit; 等价于==> #import <UIKit/UIKit.h>
@import UIKit.UIView; 等价于==> #import <UIKit/UIView.h>
5. 总结
能只在.m中使用#import,就尽量不在.h中使用#import。
如果.h必须导入文件,尽量使用@class代替#import。
尽量使用#import而不使用@import。