除非有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提交别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。
有时候无法使用向前声明,比如要声明某个类遵守一项协议。在这种情况下,尽量吧“该类遵守某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。
向前声明:
@class xxxx;
这种格式的声明就是向前声明,它仅告诉编译器该类是存在的,隐藏了具体的细节,而不是无脑引入该文件所有内容。
这样我们在.h文件中就可以使用这样的声明代替#import,因为仅仅在.h中无须知道引入类的所有借口细节。
在.m文件中,要用到引入的类,所以需要其具体的实现,这就需要使用#import导入类。
上述做法将引入头文件的时机延后,可以减少类的使用者所需引入的头文件数量,减少编译时间。
两个类互相引用:向前声明也可以解决这个问题。 假如a和b需要互相引入对方,则在a的.h中#import b 在b的.h中#import a
这样会导致循环引用,结果会导致两个类中的一个无法正确编译。
但是:
1.如果写的类继承了某个父类,需要引入定义哪个父类的头文件,不能使用向前声明。
2.引入协议的类,不能使用向前声明,因为需要知道协议中定义的方法。
可以这样:
如果是委托协议的话,可以放到.m文件中的“class-continuation分类”里面,这样只要在文件的实现中引入,而无需在公共头文件中引入。
总结:
每次在头文件中引入其他头文件的时候,先想想有没有必要。如果可以用向前声明代替则使用。
否则看看能不能尽量放到文件的实现中。
这样可以减少编译时间,还可以降低彼此的依赖程度。