標籤:
一,匯入標頭檔有兩種不同的方法:使用引號或者使用角括弧,例如,#import <Cocoa/Cocoa.h>和#import "Tire.h".帶角括弧的語句是用來匯入系統標頭檔的,而帶引號的語句則說明匯入的是項目本地的標頭檔,如果你看到的標頭檔名是用角括弧括起來的,那麼這個標頭檔對你的項目來說是唯讀,因為它屬於系統。如果標頭檔名是被引號括起來的,那麼你(或參與這個項目的其他人)就可以編輯它。
二,Objective-C提供了一種方法能夠減少由依賴關係引起的重新編譯所帶來的影響。依賴關係問題的存在是因為Objective-C編譯器需要某些資訊才能夠工作。有時,編譯器需要知道類的全部資訊,例如它的執行個體變數配置,它所繼承的所有類等。而有的時候,編譯器只需要知道類名即可,不需要瞭解它的整個含義。
例如,對象複合後,這個複合使用指向對象的指標。這樣之所以能行得通,是因為所有Objective-C對象都存放在動態分配的記憶體中。編譯器只需要知道這是一個類就可以了。然後它就地發現這個執行個體變數是指標的大小,而這個指標的大小在整個程式中都不會改變。
Objective-C引入了關鍵字@class來告訴編譯器:“這是一個類,所以,我只需要通過指標來引用它。”這樣編譯器就會“平靜”下來:它並不需要知道關於這個類的更多資訊,只要瞭解它是通過指標來引用的即可。
@class建立了一個前向引用。就是在告訴編譯器:“相信我,以後你會知道這個類到底是什麼,但是現在,你只需要知道這些”,如果有循環相依性關係,@class也很有用。即A類使用B類,B類也使用A類。如果試圖通過#import語句讓這兩個類互相引用,那麼最後就會出現編譯錯誤。但是如果在A.h中使用@class B,在B.h中使用@class A,那麼這兩個類就可以互相引用了。
三,有時候,我們在檔案中匯入了Engine.h而沒有匯入<Cocoa/Cocoa.h>,這是為什麼呢?我們知道,Engine.h中已經匯入了<cocoa/Cocoa.h>,所以,不需要我們自己再匯入一遍了。然而,如果你想在該檔案裡加上#import <Cocoa/Cocoa.h>,這是可以的,因為#import命令具有足夠的智能,它不會重複匯入自己的檔案。
四,在學習過程中,我們認識了跨檔案依賴關係,在這種關係中,標頭檔或源檔案需要使用另一個標頭檔中的資訊。檔案之間互相重複的匯入會增加編譯次數,也會導致不必要的重複編譯。而巧妙地使用@class命令能夠減少編譯時間,@class告訴編譯器“相信我,你最終能夠瞭解這個名稱的類”,它可以減少不得不匯入的標頭檔數量。
參考資料:《Objective-C基礎教程》
【讀書筆記】iOS-標頭檔匯入[email protected]注意事項