#include
- 這是最原始的C語言中的導(dǎo)入頭文件的方法。其中根據(jù)系統(tǒng)尋找頭文件路徑的不同而有兩種語法:
-
#include <header.h>:主要用來引入庫的頭文件; -
#include "header.h":主要用來引入自定義的頭文件。
- 有可能造成循環(huán)引用的問題。例如 A 引入了 B,B 又引入了 C,這時(shí)候就會(huì)報(bào) C 重復(fù)定義的錯(cuò)誤,如下圖:

頭文件重復(fù)引用.png
解決方式:如果都采用
#include 的方法,那就需要為每個(gè)頭文件中添加編譯開關(guān),這在嵌入式編程的工程中很常見。具體語法見下圖:

編譯開關(guān)語法.png
錯(cuò)誤解除。
不過在 iOS 開發(fā)中一般都使用
#import。
#import
#import 因?yàn)椴⒉皇窍?#include 那樣簡單的將頭文件的內(nèi)容進(jìn)行復(fù)制,所以可以解決 #include 因?yàn)轭^文件重復(fù)引用導(dǎo)致的重復(fù)定義的問題。不過它的交叉引用也會(huì)引發(fā)一些問題。比如,當(dāng) A 中import了 B,且 B 中又 import A,如果我們不創(chuàng)建任何變量,會(huì)發(fā)現(xiàn)編譯之后一切正常。但是,當(dāng)我們在 A 中創(chuàng)建一個(gè) B 的對(duì)象,則會(huì)報(bào)錯(cuò):

交叉引用
具體原因沒找到官方的說明,根據(jù)網(wǎng)上的資料,系統(tǒng)在加載 B 頭文件的定義時(shí),因?yàn)槠?
import 了 A,所以又拐回來加載 A 頭文件,導(dǎo)致始終找不到 B 的完成定義,所以報(bào)錯(cuò)。這個(gè)時(shí)候我們就需要
@class 來解決問題了。
@class
@class 用來告訴編譯器,有這樣一個(gè)類,作用僅僅是在寫代碼時(shí),編譯器不報(bào)錯(cuò),至于類里邊有哪些變量和方法,通過 @class 無法得知。@class 一般僅使用在 .h 文件中。
#import 和 @class 的使用場景可按照以下規(guī)則記憶:
- 頭文件 .h 中:如果是引用 <strong>父類和遵守協(xié)議</strong>,則使用
#import; - 實(shí)現(xiàn)文件 .m 中:實(shí)現(xiàn)文件中<strong>涉及到的所有類、協(xié)議以及接收消息的類</strong>都使用
#import; - 其他情況使用
@class。
@import
@import 是 Xcode 5 和 iOS 7.0 之后推出的一個(gè)新的導(dǎo)入頭文件的方式,這一年,蘋果提出了 <strong>模塊化(Module)</strong> 的概念,模塊化選項(xiàng)在之后的 Xcode 中的默認(rèn)是開啟的。使用 @import 最大的好處就是:在project settings中不必手動(dòng)添加 framework,而且在引入的時(shí)候還可以顯式的指定引用模塊中的某個(gè)子模塊,例如:@import UIKit.UIWindow;

模塊化選項(xiàng)