iOS中#import 瞳遍、@import、#include的區(qū)別
#import 菌羽、@import掠械、#include
都是為了引用頭文件被創(chuàng)造出來的。
在C和C++里是沒有#import
的注祖,只有#include
用來包含頭文件猾蒂。#include
就是將目標.h文件中的內(nèi)容拷貝到當前文件中,并替換掉這句include是晨。
但是這樣做可能會因為重復引用帶來編譯錯誤肚菠,比如B和C都引用了A,D又同時引用了B和C罩缴,這樣D引用了A兩次蚊逢。為了解決這個問題,OC加入了#import箫章,就是為了使得頭文件只被引用一次烙荷。其原理是通過
#ifndef xxx
#define xxx
來實現(xiàn)的。
問題來了:當引用關系很復雜時檬寂,編譯引用所占的代碼量就會大幅上升终抽,因為被引用的頭文件在引用的地方都被拷貝了一次。
為了解決這個問題,C語言引入了預編譯頭文件(PreCompiled Header)拿诸,將公用的頭文件放入預編譯頭文件中預先進行編譯扒袖,然后在真正編譯工程時再將預先編譯好的產(chǎn)物加入到所有待編譯的Source中去,來加快編譯速度亩码。
問題又來了:理論上說季率,想要提高編譯速度,可以把所有頭文件引用都放到pch文件中描沟。但是這樣面臨的問題是在工程中隨處都能訪問可能不該訪問的東西飒泻,這樣的結(jié)果顯然不是很理想的。
于是蘋果創(chuàng)造了Modules來解決這個問題吏廉,而使用的方式就是@import
泞遗。
Modules會在實際編譯時加入了一個用來存放已編譯添加過的Modules列表。首先在Modules列表內(nèi)查找席覆,如果在編譯的文件中引用到某個Module史辙,則直接使用;如果沒有佩伤,則把引用的頭文件編譯后加入到這個表中聊倔。這樣被引用到的Modules只會被編譯一次,也避免了在工程中隨處都能訪問可能不該訪問的東西生巡。
思考:Modules的引入有沒有什么缺陷呢耙蔑?
總結(jié)
因為需要,某種事物被創(chuàng)造出來孤荣。但開始可能并不完美甸陌,為了解決問題,就會引入新的東西盐股,而新的東西可能依然會存在缺陷钱豁,這樣就會又有新的東西出現(xiàn),直到問題完美解決遂庄。
第一次寫文章寥院,有不周到的地方還請指正。