頭部預(yù)處理的執(zhí)行方式:
#include是c/c++導(dǎo)入頭文件的關(guān)鍵字
用 #ifndef ... #define ... #endif (防止頭文件被重復(fù)包含!)
#import 是oc導(dǎo)入頭文件的關(guān)鍵字卧檐,
#import實(shí)現(xiàn)了這種防止頭文件重復(fù)包含的功能,
只會(huì)自動(dòng)導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入(遞歸包含)砸喻,不會(huì)引起交叉編譯廷蓉。
避免重復(fù)引用可能帶來(lái)的編譯錯(cuò)誤熄求。
import就是把.h文件中的內(nèi)容全部復(fù)制過(guò)來(lái)次兆。
#import <> 和 #import ""
#import <> 引用系統(tǒng)文件箱舞,它用于對(duì)系統(tǒng)自帶的頭文件的引用贮折,
編譯器會(huì)在系統(tǒng)文件目錄下去查找該文件.
#import "" :用戶自定義的文件用雙引號(hào)引用裤翩,
編譯器首先會(huì)在用戶目錄下查找,然后到安裝目錄中查调榄,最后在系統(tǒng)文件中查找
@class用于.h頭文件踊赠,只是告訴編譯器,其后面聲明的名稱是類的名稱振峻,
至于這些類是如何定義的臼疫,暫時(shí)不用考慮。防止循環(huán)引用扣孟。
而在實(shí)現(xiàn)類.m文件里面烫堤,因?yàn)闀?huì)用到這個(gè)引用類的內(nèi)部的實(shí)體變量和方法,
所以需要使用#import來(lái)包含這個(gè)被引用類的頭文件凤价。
@import是iOS 7之后的新特性語(yǔ)法鸽斟,
這種方式叫Modules(模塊導(dǎo)入) 或者 "semantic import(語(yǔ)義導(dǎo)入)" ,
通過(guò)@import語(yǔ)法來(lái)導(dǎo)入任何的framework,
Modules是一種將所有可執(zhí)行的framework打包在一起。
不用在project settings那里添加framework利诺,系統(tǒng)會(huì)自動(dòng)幫你加載上了富蓄。
使用Modules方式:
將 #import <MapKit/MapKit.h> 替換為 @import MapKit;即可。
而且你也可以只加載framework里面的submodules:
@import MapKit.MKAnnotation;
在Build Settings中將Enable Modules(C and Objective-C)打開(kāi)慢逾,
然后保持原來(lái)的#import寫(xiě)法就行了立倍。是的,不需要任何代碼上的改變侣滩,
編譯器會(huì)在編譯的時(shí)候自動(dòng)地把可能的地方換成Modules的寫(xiě)法去編譯的口注。
總結(jié):
能在實(shí)現(xiàn)文件中#import,就不在頭文件中#import君珠。
能在頭文件中@class寝志,就不在頭文件中#import。
一般如果有繼承關(guān)系的用#import,
如B是A的子類那么在B中聲明A?xí)r用#import