2016年2月17日 星期三

#import V.S. @import

在c++中只有#include,這個預處理指定可以幫你把另一個.h的內容都複製一份過來你的檔案中,但這會有一個問題,你可以重覆複製了多份相同的.h過來。
於是obj-c中新增了#import來解決這個問題,#import會在複製過來.h之前先判斷是否已經複製過了,這樣一來可以保證你的檔案中只會有一份其他的.h。

但是這樣一來還是有個問題沒有解決:相同的.h引用到太多不同的檔案,造成編譯上的時間浪費,也會增加檔案的容量。

既然如此,那為什麼不找一個地方,先把這些要引用的.h先編譯好,放過去直接給你的檔案呼叫呢?
.pch檔就是在做這種事,你可以把你要預編譯的.h都放在這裡,在你的每一個檔案中都可以直接使用,這樣就可以加快編譯的速度。
但這裡又有一個問題,如果你的每一個.h都可以被你的任一檔案給呼叫,那你引入的module間的關係不就大亂了嗎?
於是Apple加入了Modules機制,LLVM5.0中加入了@import這個新語法,讓你可以像用#import一樣引入不同的.h,但這些.h的module都是被預編譯好的等著你來呼叫,如此一來既加快了編譯的速度,又可以保持引用.h的安全性。

P.S. 目前這個Modules機制僅適用於Apple原生的module(不適用第三方或是你自己編寫的module)。
P.S. 在iOS 7 SDK以上,預設使用Modules機制並且會將你的#import轉成@import

沒有留言:

張貼留言