iOS中#import 、@import、#include的區(qū)別

iOS中#import 、@import、#include的區(qū)別

#import 、@import、#include 都是為了引用頭文件被創(chuàng)造出來的。

在C和C++里是沒有#import的,只有#include用來包含頭文件。#include就是將目標(biāo).h文件中的內(nèi)容拷貝到當(dāng)前文件中,并替換掉這句include。

但是這樣做可能會(huì)因?yàn)橹貜?fù)引用帶來編譯錯(cuò)誤,比如B和C都引用了A,D又同時(shí)引用了B和C,這樣D引用了A兩次。為了解決這個(gè)問題,OC加入了#import,就是為了使得頭文件只被引用一次。其原理是通過

#ifndef xxx
#define xxx

來實(shí)現(xiàn)的。
問題來了:當(dāng)引用關(guān)系很復(fù)雜時(shí),編譯引用所占的代碼量就會(huì)大幅上升,因?yàn)楸灰玫念^文件在引用的地方都被拷貝了一次。

為了解決這個(gè)問題,C語(yǔ)言引入了預(yù)編譯頭文件(PreCompiled Header),將公用的頭文件放入預(yù)編譯頭文件中預(yù)先進(jìn)行編譯,然后在真正編譯工程時(shí)再將預(yù)先編譯好的產(chǎn)物加入到所有待編譯的Source中去,來加快編譯速度。

問題又來了:理論上說,想要提高編譯速度,可以把所有頭文件引用都放到pch文件中。但是這樣面臨的問題是在工程中隨處都能訪問可能不該訪問的東西,這樣的結(jié)果顯然不是很理想的。

于是蘋果創(chuàng)造了Modules來解決這個(gè)問題,而使用的方式就是@import。
Modules會(huì)在實(shí)際編譯時(shí)加入了一個(gè)用來存放已編譯添加過的Modules列表。首先在Modules列表內(nèi)查找,如果在編譯的文件中引用到某個(gè)Module,則直接使用;如果沒有,則把引用的頭文件編譯后加入到這個(gè)表中。這樣被引用到的Modules只會(huì)被編譯一次,也避免了在工程中隨處都能訪問可能不該訪問的東西。

思考:Modules的引入有沒有什么缺陷呢?

總結(jié)

因?yàn)樾枰?,某種事物被創(chuàng)造出來。但開始可能并不完美,為了解決問題,就會(huì)引入新的東西,而新的東西可能依然會(huì)存在缺陷,這樣就會(huì)又有新的東西出現(xiàn),直到問題完美解決。

第一次寫文章,有不周到的地方還請(qǐng)指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容