在类的头文件中尽量少引入其他头文件

1、用Objective-C语言编写“类”的标准方式:以类名做文件名,分别创建两个文件,头文件后缀用.h,实现文件后缀用.m。
 
2、用Objective-C语言编写任何类几乎都需要引入Foundation.h。如果不在该类本身引入这个文件的话,那么就要引入与其超类所属框架相对应的“基本头文件”。例如,使用Xcode创建一个继承UIViewController类的PersonViewController类,在其头文件中引用的不是UIViewController,而是#import <UIKit/UIKit.h>。
 
3、在头文件中声明的属性或者方法时,如果需要引用其他的类,使用“向前声明”@class该类,而不是使用#import该类。例如,把EOCEmployer.h引入到EOCPerson.h,那么只要引入EOCPerson.h就会一并引入EOCEmployer.h放入所有内容。此过程若持续下去,则要引入许多根本用不到的内容,这当然会增加编译时间。
 
4、使用“向前声明”还可以避免“循环引用”问题。例如,若要编译EOCEmployer,则编译器必须知道EOCPerson这个类,而要编译EOCPerson,则又必须知道EOCEmployer。如果在各自头文件中引入对方的头文件,则会导致“循环引用”。当解析其中一个头文件时,编译器会发现它引入了另一个头文件,而那个头文件又回过头来引用第一个头文件。使用#import而非#include指令虽然不会导致死循环,但却意味着两个类里有一个无法被正确编译。
 
5、如果要声明你写的类遵从某个协议(protocol),那么该协议必须有完整定义,且不能使用向前声明。向前声明只能告诉编译器有某个协议,而此时编译器却要知道该协议中定义的方法。因此,如果你要声明<EOCDrawableDelegate>则需要引入包含该协议的类#import<EOCDrawable>。因此,只要引入此协议,就必定会引入那个头文件中的全部内容,如此一来,就像之前说的那样,会产生互相依赖问题,而且还会增加编译时间。鉴于此,最好是把协议单独放在一个头文件中。
 
6、然而有些协议,例如“委托协议”(delegate protocol),就不用单独写一个头文件了。在那种情况下,协议只有与接受协议委托的类放在一起定义才有意义。此时最好能在实现文件中声明此类实现了该委托协议,并把这段实现代码放在分类里。这样的话,只要在实现文件中引入包含委托协议的头文件即可,而不需要将其放在公共头文件里。
 
原文地址:https://www.cnblogs.com/cchHers/p/6931159.html