OC关键字:#include #import @class @

2018-03-28  本文已影响70人  我是谁重要吗

头部预处理的执行方式:

#include是c/c++导入头文件的关键字 
用 #ifndef ... #define ... #endif (防止头文件被重复包含!)


#import 是oc导入头文件的关键字,
#import实现了这种防止头文件重复包含的功能,
只会自动导入一次,不会重复导入(递归包含),不会引起交叉编译。
避免重复引用可能带来的编译错误。
import就是把.h文件中的内容全部复制过来。

#import <> 和 #import ""
#import <> 引用系统文件,它用于对系统自带的头文件的引用,
编译器会在系统文件目录下去查找该文件.
#import "" :用户自定义的文件用双引号引用,
编译器首先会在用户目录下查找,然后到安装目录中查,最后在系统文件中查找


@class用于.h头文件,只是告诉编译器,其后面声明的名称是类的名称,
至于这些类是如何定义的,暂时不用考虑。防止循环引用。
而在实现类.m文件里面,因为会用到这个引用类的内部的实体变量和方法,
所以需要使用#import来包含这个被引用类的头文件。


@import是iOS 7之后的新特性语法,
这种方式叫Modules(模块导入) 或者 "semantic import(语义导入)" ,
通过@import语法来导入任何的framework,
Modules是一种将所有可执行的framework打包在一起。
不用在project settings那里添加framework,系统会自动帮你加载上了。
使用Modules方式:
将 #import <MapKit/MapKit.h> 替换为 @import MapKit;即可。
而且你也可以只加载framework里面的submodules:
@import MapKit.MKAnnotation;
在Build Settings中将Enable Modules(C and Objective-C)打开,
然后保持原来的#import写法就行了。是的,不需要任何代码上的改变,
编译器会在编译的时候自动地把可能的地方换成Modules的写法去编译的。


总结:
能在实现文件中#import,就不在头文件中#import。
能在头文件中@class,就不在头文件中#import。
一般如果有继承关系的用#import,
如B是A的子类那么在B中声明A时用#import
上一篇下一篇

猜你喜欢

热点阅读