#include / #import / @import / @class

#include

  1. 这是最原始的C语言中的导入头文件的方法。其中根据系统寻找头文件路径的不同而有两种语法:
  • #include <header.h>:主要用来引入库的头文件;
  • #include "header.h":主要用来引入自定义的头文件。
  1. 有可能造成循环引用的问题。例如 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 的使用场景可按照以下规则记忆:

  1. 头文件 .h 中:如果是引用 <strong>父类和遵守协议</strong>,则使用 #import
  2. 实现文件 .m 中:实现文件中<strong>涉及到的所有类、协议以及接收消息的类</strong>都使用 #import
  3. 其他情况使用 @class

@import

@import 是 Xcode 5 和 iOS 7.0 之后推出的一个新的导入头文件的方式,这一年,苹果提出了 <strong>模块化(Module)</strong> 的概念,模块化选项在之后的 Xcode 中的默认是开启的。使用 @import 最大的好处就是:在project settings中不必手动添加 framework,而且在引入的时候还可以显式的指定引用模块中的某个子模块,例如:@import UIKit.UIWindow;

模块化选项

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容