1. 程式人生 > >談一談標頭檔案引用(#include,#import,@import,@class)

談一談標頭檔案引用(#include,#import,@import,@class)

#include,#import,@import,@class 這四個指令在 ios (OC)開發中比較常見之所以共存,是因為四者有較大的區別,下面來一一詳解。

#include

熟悉 C 或者 C++ 的童鞋可能會知道,在 C 和 C++ 裡,#include 是非常常見的,用來包含標頭檔案。#include 做的事情其實就是簡單的複製貼上,將目標 .h 檔案中的內容一字不落地拷貝到當前檔案中,並替換掉這句 include。
注意點:在使用#include的時候要注意處理重複引用(這也是objc中#include與#import的區別)

#import

#import 大部分功能和 #include 是一樣的,但是他處理了重複引用的問題,我們在引用檔案的時候不用再去自己進行重複引用處理,這使你在遞迴包含中不會出現問題。總的來說,#import 比起 #include 的好處就是不會引起交叉編譯。

@import

@import 是 iOS 7 之後的新特性語法,這種方式叫 Modules(模組匯入) 或者 “semantic import(語義匯入)” ,是一種更好的頭部預處理的執行方式,這 iOS 7 之後你能通過 @import 語法來匯入任何的framework,Modules 是一種將所有可執行的 framework 打包在一起,只有在需要時才能匯入到原始碼中,這種方式比起傳統的 #import 更安全和更高效。

舉個例子:

#import <SomeLibrary/SomeFile.h>

要將此庫作為模組匯入,程式碼將改為:

@import SomeLibrary
;

這有助於將程式碼將 SomeLibrary 框架自動連結到專案中。模組還允許您僅將您真正需要的元件包含在專案中。例如,如果要在 AwesomeLibrary 框架中使用 AwesomeObject 元件,通常您必須匯入所有內容才能使用一個。但是,使用模組可以匯入要使用的特定物件:

@import AwesomeLibrary.AwesomeObject;

實際開發中上可能並不需要使用 @import 關鍵字。如果你選擇使用”modules”(Xcode5 以後中預設開啟,如下圖所示),所有的 #import 和 #include 指令都會自動對映使用 @import。尤其對於沒有善用 .pch 標頭檔案的開發者或者你的專案中有許多零碎小的原始檔時, 使用 @import 匯入指定框架下需要的標頭檔案時,Xcode 的編譯表現會有提高。
這裡寫圖片描述

@class

主要是用於宣告一個類,告訴編譯器它後面的名字是一個類的名字,而這個類的定義實現是暫時不用知道的,後面會告訴你.也是因為在 @class 僅僅只是宣告一個類,所以在後面的實現檔案裡面是需要去 #import 這個類,這時候才包含了這個被引用的類的所有資訊。一般來說,在 interface 中引用一個類,就用 @class,它會把這個類作為一個型別來使用,而在實現這個 interface 的檔案中,如果需要引用這個類的實體變數或者方法之類的,還是需要 import 這個在 @class 中宣告的類。