爲何在類的頭文件要儘可能少的引入其它頭文件呢?對象
首先是爲了提升封裝性,若是引入了其它頭文件,那麼它們就必須得公開才行,一樣的,既然沒必要要提供的頭文件公開了,別人也能夠在其它地方引入這些頭文件以及調用它們的方法。繼承
再有一個就是能提升項目的編譯速度,爲何呢?由於編譯器在編譯文件的時候,若是引入了其它文件的頭文件,那麼編譯器也會把所引入的各個頭文件給編譯一遍,明顯得花費更多的編譯時間。接口
那麼何時應該引入其它頭文件,何時又不該該引入呢,不引入的時候須要用到該類型又該怎麼辦呢?編譯器
先來講一下何時應該引入頭文件吧:io
在須要瞭解類具體細節,好比屬性有哪些,提供的方法有哪些的時候就必須引入頭文件,就比如你所寫的類是繼承某超類,或者你所寫的類遵循某協議,都須要把完整的頭文件引入。說道遵循協議,若是不必讓其餘人知道我所寫的類是遵循了某個協議,也就是不想把這個類遵循的協議公開的話,能夠把遵循某協議的聲明放到.m的「class-continuation」分類中,而且也把引入頭文件的代碼搬回到.m上。何時是有必要公開這個類所遵循某協議呢?好比在其它文件中有一個接口,參數要求是遵循了某協議的類型,正好你所編寫的類須要用做參數傳入的時候才須要公開,若是不公開的話那麼編譯器會認定爲類型不正確。編譯
再來講一下何時不引入頭文件而需使用該類型的時候:class
在類的頭文件只須要知道有這麼一個類型的時候,便不須要把頭文件引入,可是不引入怎麼讓編譯器知道有這麼一個類型呢?循環
那就須要使用「向前聲明」該類,也就是方法
@class ClassName;總結
這個「向前聲明」還有一個做用就是,可以解決相互循環引入致使沒法編譯的問題。
在實現文件中,若是要使用該類型對象的接口,那麼這時候才須要引入該類型的頭文件,總之就是在有必要的時候才把其它的頭文件引入。
最後抄一下書本的總結:
除非確有必要,不然不要引入頭文件。通常來講,應在某個類的頭文件中使用向前聲明來說起別的類,並在實現文件中引入那些類的頭文件。這樣作能夠儘可能下降類之間的耦合。
有時沒法使用向前聲明,好比要聲明某個類遵循一項協議。這種狀況下,儘可能把該類遵循某協議的這條聲明移至「class-continuation分類」中,若是不行的話,就把該協議單獨放在一個頭文件中,而後將其引入。