02_@class與#import

結論

  • 除非確有必要否則不要引入頭文件。一般來說,應在某個類的頭文件中使用向前聲明來提及別的類,并在實現文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合(coupling)。
  • 有時無法使用向前聲明,比如要聲明某個類遵循一項協議。這種情況下,盡量把“該類遵循某協議”的這條聲明移至“class-continuation分類”中。如果不行的話,就把協議單獨放在一個頭文件中,然后將其引入。

循環引用

存在兩個類classA與classB,此時如果classB中有classA所需要的屬性或者方法,則在classA的頭文件中使用#import引入classB;同時如果classA中有classB所需要的屬性或者方法,則在classB的頭文件中使用#import引入classA;這樣當編譯classA這個類的時候,編譯器發現先需要解析classB這個類,而當編譯器去解析classB這個類的時候,發現需要先解析classA這個類,這樣就導致了“循環引用”。雖然使用#import不會像#include那樣會導致死循環,但卻會造成某個類無法被正確編譯。

這時我們需要把這一情況告訴編譯器,@class此時就有了用武之地,可以在各自的頭文件中實用@class來聲明各自需要引入的類,而在實現文件中使用#import將其引入,這樣就可以避免“循環引用”的問題發生,這叫做“向前聲明”。

但是有時候必須要在頭文件中引入其他頭文件。例如寫的某個類繼承自某個超類,則必須引入定義那個超類的頭文件。同理,如果要聲明某個類需要遵從某個協議(protocol),那么該協議必須有完整定義,且不能使用向前聲明。向前聲明只能告訴編譯器有某個協議,而此時編譯器卻需要知道該協議中定義的方法。

  • 鑒于此,最好是把協議單獨放在一個頭文件中。
  • 然后有些協議,例如“委托協議”只有與接收協議委托的類放在一起才有意義。此時最好能在實現文件中聲明此類實現了該委托協議,并把這段實現代碼放在“class-continuation分類”里。這樣的話,只要在實現文件中引入包含委托協議的頭文件即可,而不需要將其放在公共頭文件(public head file)里。

@class、#import與#include的區別

  • @class:告訴編譯器當前工程中包含有這個類,只有在運行時才會具體的去查找這個類;
  • #######include:引入當前工程中包含的一個類,缺點是不能防止重復引入同一頭文件;
  • #######import:是#include的升級版,可以防治重復引入同一頭文件。

PCH文件

有時我們需要將一些頻繁使用的類集中放在一起,例如工具類,為整個項目封裝的多處使用的View類等,為了不頻繁的將同一個類導入項目中多處需要使用的類中,這時我們可以使用PCH文件來管理這些類。在Xcode 6之前,每新建一個工程,Xcode都會為項目生成一個PCH文件。現在,我們需要自己新建PCH文件來管理頻繁使用的類。

PCH文件:預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)里。這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只是它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼。

GitHub傳送門:PCH

1、PCH文件的創建

1、打開新建文件頁面,在Other里面選擇PCH File,點擊Next;
2、輸入PCH文件名,一般輸入工程名,點擊create,PCH文件創建成功。


新建PCH文件.png
2、配置PCH文件

1、打開工程配置,選擇Build Settings;
2、在搜索框輸入Prefix Header,左側選擇All,回車;
3、選中Prefix Header,在其后面的空白處雙擊;
4、在彈出的小框內輸入配置路徑,格式是:$(SRCROOT)/項目名/PCH文件名。
注意:輸入PCH文件時不能省略后綴名。


PCH文件配置.png

每次在文件中引入其他頭文件之前,都要事先問問自己這樣做是否有必要。如果可以用向前聲明取代引入,那么最好使用向前聲明。若因為要實現屬性、實例變量或者要遵循協議而必須引入頭文件,則應盡量將其移至“class-continuation分類”中。這樣做不僅可以縮短編譯時間,而且還能降低彼此依賴程度。若是依賴關系過于負責,則會給維護帶來麻煩,而且,如果只想把代碼的某個部分開放為公共API的話,太復雜的依賴關系也會出問題。

寫在最后:當今社會競爭中想要脫穎而出,人必須有一技之長,而且萬里挑一。 每個人都有不同的選擇,有時一個正確的選擇比奮斗本身更重要。 做你喜歡的事情,做你擅長的事情。 沒有七十二變,豈能大鬧天宮?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容