#import
#include任務(wù)是將.h文件全部拷貝到當(dāng)前文件斟或,并替換這句#include
#import改進(jìn),在#include的基礎(chǔ)上多了一個(gè)能夠避免頭文件重復(fù)引用的功能
pch
原理
- 編譯.m文件前殊轴,編譯器對(duì)PCH內(nèi)容進(jìn)行預(yù)編譯叽躯,將其變成二進(jìn)制中間格式緩存
- 編譯.m文件時(shí)檩坚,如果需要PCH里的內(nèi)容骗污,直接讀取崇猫,無須再次編譯
缺點(diǎn)
- 梳理清楚引用關(guān)系麻煩
- 引發(fā)命名空間被污染的問題
- 一個(gè)龐大的Prefix Header會(huì)增加Build耗時(shí)
module
是啥?
理解為一種對(duì)組件的描述需忿,包含接口和實(shí)現(xiàn)的描述诅炉。
同時(shí) Module 的產(chǎn)物是被獨(dú)立編譯出來的蜡歹,不同的 Module 之間是不會(huì)影響的。
被引用的Module只會(huì)被編譯一次涕烧,且在運(yùn)行過程中不會(huì)相互影響月而。
目的
解決與傳統(tǒng)#include和#import機(jī)制相關(guān)的問題
原理
如果在編譯中的文件中引用到某個(gè)Module,系統(tǒng)將優(yōu)先在這個(gè)列表內(nèi)查找是否存在對(duì)應(yīng)的中間產(chǎn)物议纯,如能找到父款,則說明文件已經(jīng)被編譯過,直接使用痹扇;
如果沒找到則把引用到的頭文件進(jìn)行編譯铛漓,并將產(chǎn)物添加到相應(yīng)的空間中以備重復(fù)使用溯香。
使用
Build setting 中設(shè)置 Enable Module 設(shè)置為YES
自定義組件需要設(shè)置Defines Model 設(shè)置為YES
@import iAd;
同 #import <iAd/iAd.h>
@import iAd.ADBannerView
同 #import <iAd/ADBannerView.h.h>
編譯器能夠?qū)⒎夏撤N格式的#import 語(yǔ)句自動(dòng)轉(zhuǎn)換成Modul識(shí)別的@import語(yǔ)句
#import <UIKit/UIKit.h>
-> @import UIKit;
優(yōu)點(diǎn)
雖然這種引入方式和之前的寫法區(qū)別不大鲫构,但它們?cè)诒举|(zhì)上還是有很大程度的不同,module 不會(huì)“復(fù)制粘貼”頭文件里的內(nèi)容玫坛,也不會(huì)讓 @import 所暴露的 API 被開發(fā)者本地的上下文篡改
Header map
是啥结笨?
二進(jìn)制文件,包含頭文件和頭文件路徑的映射表
核心功能:
是讓編譯器能夠找到相應(yīng)的頭文件的位置湿镀,相較于使用header search path提供的路徑查找會(huì)快很多
開啟方法:
build setting 中 Use Header Map 設(shè)為YES
工作方式
一旦開啟Use Header Map選項(xiàng)后炕吸,Xcode會(huì)優(yōu)先去hmap映射表里找頭文件路徑;
找不到的情況去header search path中提供的路徑遍歷搜索
cocoapods命中問題
Static Library
頭文件類型都為Project類型 hmap中只會(huì)包含#import “A.h”
的鍵值引用 ,只有#import “A.h”
才能命中hmap勉痴,否則通過Header Search Path 尋找其相關(guān)路徑
參考于美團(tuán)技術(shù)文章:一款可以讓大型iOS工程編譯速度提升50%的工具 - 美團(tuán)技術(shù)團(tuán)隊(duì) (meituan.com)