第 2 条:在类的头文件中尽量少引入其他头文件

常见引入一个类的方法(头文件):

#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”中,或单独放到一个头文件中再引入。

主要来源:《Effective Objective-C 2.0》

你可能感兴趣的:(第 2 条:在类的头文件中尽量少引入其他头文件)