iOS-#include、#import、@class、@import

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。

猜你喜欢

转载自blog.csdn.net/qq_36557133/article/details/87405322