为何在类的头文件要尽可能少的引入其它头文件呢?对象
首先是为了提升封装性,若是引入了其它头文件,那么它们就必须得公开才行,一样的,既然没必要要提供的头文件公开了,别人也能够在其它地方引入这些头文件以及调用它们的方法。继承
再有一个就是能提升项目的编译速度,为何呢?由于编译器在编译文件的时候,若是引入了其它文件的头文件,那么编译器也会把所引入的各个头文件给编译一遍,明显得花费更多的编译时间。接口
那么何时应该引入其它头文件,何时又不该该引入呢,不引入的时候须要用到该类型又该怎么办呢?编译器
先来讲一下何时应该引入头文件吧:io
在须要了解类具体细节,好比属性有哪些,提供的方法有哪些的时候就必须引入头文件,就比如你所写的类是继承某超类,或者你所写的类遵循某协议,都须要把完整的头文件引入。说道遵循协议,若是不必让其余人知道我所写的类是遵循了某个协议,也就是不想把这个类遵循的协议公开的话,能够把遵循某协议的声明放到.m的“class-continuation”分类中,而且也把引入头文件的代码搬回到.m上。何时是有必要公开这个类所遵循某协议呢?好比在其它文件中有一个接口,参数要求是遵循了某协议的类型,正好你所编写的类须要用做参数传入的时候才须要公开,若是不公开的话那么编译器会认定为类型不正确。编译
再来讲一下何时不引入头文件而需使用该类型的时候:class
在类的头文件只须要知道有这么一个类型的时候,便不须要把头文件引入,可是不引入怎么让编译器知道有这么一个类型呢?循环
那就须要使用“向前声明”该类,也就是方法
@class ClassName;总结
这个“向前声明”还有一个做用就是,可以解决相互循环引入致使没法编译的问题。
在实现文件中,若是要使用该类型对象的接口,那么这时候才须要引入该类型的头文件,总之就是在有必要的时候才把其它的头文件引入。
最后抄一下书本的总结:
除非确有必要,不然不要引入头文件。通常来讲,应在某个类的头文件中使用向前声明来说起别的类,并在实现文件中引入那些类的头文件。这样作能够尽可能下降类之间的耦合。
有时没法使用向前声明,好比要声明某个类遵循一项协议。这种状况下,尽可能把该类遵循某协议的这条声明移至“class-continuation分类”中,若是不行的话,就把该协议单独放在一个头文件中,而后将其引入。