Aspect切面編程
定義
切面編程:
以通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù)。
Aspects簡(jiǎn)介:
Aspects github地址:https://github.com/steipete/Aspects.git
#pragma mark - Public Aspects API
+ (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error {
return aspect_add((id)self, selector, options, block, error);
} //鉤一個(gè)類所有實(shí)例方法中的某一個(gè)方法
- (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error {
return aspect_add(self, selector, options, block, error);
} //鉤取一個(gè)實(shí)例對(duì)象的某一個(gè)方法
實(shí)現(xiàn)原理
基于消息轉(zhuǎn)發(fā)
Aspects主要是利用了forwardInvocation進(jìn)行轉(zhuǎn)發(fā),Aspects利用和kvo類似的原理,通過(guò)動(dòng)態(tài)創(chuàng)建子類的方式,把對(duì)應(yīng)的對(duì)象isa指針指向創(chuàng)建的子類,然后把子類的forwardInvocation的IMP替成__ASPECTS_ARE_BEING_CALLED__
注意
處理調(diào)用邏輯, 有before, instead, after, remove四種option插入狀態(tài)。
將block轉(zhuǎn)換成一個(gè)NSInvocation對(duì)象以供調(diào)用。
二進(jìn)制優(yōu)化
原理

利用iOS系統(tǒng)物理內(nèi)存與虛擬內(nèi)存映射的機(jī)制,把所有啟動(dòng)時(shí)候的代碼都放在一頁(yè)或者兩頁(yè),這樣就很大程度上優(yōu)化啟動(dòng)速度即二進(jìn)制重拍。
實(shí)現(xiàn)
1.Instruments調(diào)試工具 -> System Trace
調(diào)試工具,測(cè)試啟動(dòng)時(shí)間
2.BuildSetting -> Write Link Map File -> yes
打開(kāi)項(xiàng)目的符號(hào)順序輸出開(kāi)關(guān)
3.通過(guò)Clang獲取APP啟動(dòng)時(shí)候調(diào)用的所有方法
Other C Flags 在里面添加相關(guān)參數(shù),第一個(gè)啟動(dòng)頁(yè)面里加入相應(yīng)庫(kù)函數(shù)和代碼段
4.Build setting -> Order File
加載符號(hào)加載順序文件