常见引入一个类的方法(头文件):
#import "EOCEmployer.h" //这样可行,但不够优雅。
在编译一个使用了 EOCPerson 类的文件时,不需知道 EOCEmployer 类的全部细节,只需知道有一个类名为 EOCEmployer 就好。可以这样写:
@class EOCEmployer;
这叫做“向前声明”(forward declaring)该类。
将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所需引入的头文件数量。也解决了两个类相互引用的问题。
若把 EOCEmployer.h 引入到 EOCPerson.h,则只要引入 EOCPerson.h, 就会一并引入 EOCEmployer.h 的所有内容。此过程若持续下去,则要引入许多根本用不到的内容,这当然会增加编译时间。
如果在各自头文件中引入对方的头文件,则会导致“循环引用”(chicken-and-egg situation)。虽然使用
#import
而非#include
不会导致死循环,但两个类其中一个无法正确编译。
若一个类继承自某个超类,则必须引入定义那个超类的头文件。
同理,若要声明一个类遵从某个协议(protocol),该协议必须有完整定义,且不能使用向前声明(向前声明只能告诉编译器有某个协议,而此时编译器却要知道该协议中定义的方法)。
要点:
- 除非有必要,否则不要引入头文件。一般来说,应在某个类的 头文件 中使用 向前声明 来提及别的类,并在 实现文件 中 引入 那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。
- 无法使用向前声明时,尽量把“该类遵循某协议”这条声明移至“class-continuation”中,或单独放到一个头文件中再引入。