导入头文件在头文件和进行导入的源文件之间建立了一种很强的依赖关系。
为此,Objective-C 提供了一种方法能够减少由依赖关系引起的重新编译所带来的影响。依赖关系问题的存在是因为 Objective-C 编译器需要某些信息才能工作。有时,编译器需要知道类的全部信息,例如它的实例变量配置、它所继承的所有类等。而有的时候,编译器只需要知道类名即可,不需要了解它的整个定义。
Objective-C 引入了关键字 @class
来告诉编译器:“这是一个类,所以我只需要通过指针来引用它。”
示例:
1 | #import <Cocoa/Cocoa.h> |
@class
创建了一个前向引用,就是在告诉编译器:“相信我,以后你会知道这个类到底是什么。但是现在,你只需要知道这些。”
如果有编译依赖关系,@class
也很有用。即 A 类使用 B 类,B 类也使用 A 类。如果试图通过 #import
语句让两个类互相引用,那么最后就会出现编译错误。但是如果在 A.h 中使用 @class B
,在 B.h 中使用 @class A
,那么这两个类就可以互相引用了。
@class
语句指向父类。编译器需要先知道所有关于超类的信息才能成功地为其子类编译 @interface
。它需要了解父类实例变量的配置(数据类型、大小和排序)。