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)指正。