#include
- 這是最原始的C語言中的導入頭文件的方法。其中根據系統尋找頭文件路徑的不同而有兩種語法:
-
#include <header.h>
:主要用來引入庫的頭文件; -
#include "header.h"
:主要用來引入自定義的頭文件。
- 有可能造成循環引用的問題。例如 A 引入了 B,B 又引入了 C,這時候就會報 C 重復定義的錯誤,如下圖:
頭文件重復引用.png
解決方式:如果都采用
#include
的方法,那就需要為每個頭文件中添加編譯開關,這在嵌入式編程的工程中很常見。具體語法見下圖:
編譯開關語法.png
錯誤解除。
不過在 iOS 開發中一般都使用
#import
。
#import
#import
因為并不是像 #include
那樣簡單的將頭文件的內容進行復制,所以可以解決 #include
因為頭文件重復引用導致的重復定義的問題。不過它的交叉引用也會引發一些問題。比如,當 A 中import
了 B,且 B 中又 import
A,如果我們不創建任何變量,會發現編譯之后一切正常。但是,當我們在 A 中創建一個 B 的對象,則會報錯:
交叉引用
具體原因沒找到官方的說明,根據網上的資料,系統在加載 B 頭文件的定義時,因為其
import
了 A,所以又拐回來加載 A 頭文件,導致始終找不到 B 的完成定義,所以報錯。這個時候我們就需要
@class
來解決問題了。
@class
@class
用來告訴編譯器,有這樣一個類,作用僅僅是在寫代碼時,編譯器不報錯,至于類里邊有哪些變量和方法,通過 @class
無法得知。@class
一般僅使用在 .h 文件中。
#import
和 @class
的使用場景可按照以下規則記憶:
- 頭文件 .h 中:如果是引用 <strong>父類和遵守協議</strong>,則使用
#import
; - 實現文件 .m 中:實現文件中<strong>涉及到的所有類、協議以及接收消息的類</strong>都使用
#import
; - 其他情況使用
@class
。
@import
@import
是 Xcode 5 和 iOS 7.0 之后推出的一個新的導入頭文件的方式,這一年,蘋果提出了 <strong>模塊化(Module)</strong> 的概念,模塊化選項在之后的 Xcode 中的默認是開啟的。使用 @import
最大的好處就是:在project settings
中不必手動添加 framework,而且在引入的時候還可以顯式的指定引用模塊中的某個子模塊,例如:@import UIKit.UIWindow;
模塊化選項