#include
- 这是最原始的C语言中的导入头文件的方法。其中根据系统寻找头文件路径的不同而有两种语法:
-
#include <header.h>
:主要用来引入库的头文件; -
#include "header.h"
:主要用来引入自定义的头文件。
- 有可能造成循环引用的问题。例如 A 引入了 B,B 又引入了 C,这时候就会报 C 重复定义的错误,如下图:
头文件重复引用.png
解决方式:如果都采用
#include
的方法,那就需要为每个头文件中添加编译开关,这在嵌入式编程的工程中很常见。具体语法见下图:
编译开关语法.png
错误解除。
不过在 iOS 开发中一般都使用
#import
。
#import
#import
因为并不是像 #include
那样简单的将头文件的内容进行复制,所以可以解决 #include
因为头文件重复引用导致的重复定义的问题。不过它的交叉引用也会引发一些问题。比如,当 A 中import
了 B,且 B 中又 import
A,如果我们不创建任何变量,会发现编译之后一切正常。但是,当我们在 A 中创建一个 B 的对象,则会报错:
交叉引用
具体原因没找到官方的说明,根据网上的资料,系统在加载 B 头文件的定义时,因为其
import
了 A,所以又拐回来加载 A 头文件,导致始终找不到 B 的完成定义,所以报错。这个时候我们就需要
@class
来解决问题了。
@class
@class
用来告诉编译器,有这样一个类,作用仅仅是在写代码时,编译器不报错,至于类里边有哪些变量和方法,通过 @class
无法得知。@class
一般仅使用在 .h 文件中。
#import
和 @class
的使用场景可按照以下规则记忆:
- 头文件 .h 中:如果是引用 <strong>父类和遵守协议</strong>,则使用
#import
; - 实现文件 .m 中:实现文件中<strong>涉及到的所有类、协议以及接收消息的类</strong>都使用
#import
; - 其他情况使用
@class
。
@import
@import
是 Xcode 5 和 iOS 7.0 之后推出的一个新的导入头文件的方式,这一年,苹果提出了 <strong>模块化(Module)</strong> 的概念,模块化选项在之后的 Xcode 中的默认是开启的。使用 @import
最大的好处就是:在project settings
中不必手动添加 framework,而且在引入的时候还可以显式的指定引用模块中的某个子模块,例如:@import UIKit.UIWindow;
模块化选项