iOS runtime入門級(jí)的舉例

runtime.
中文翻譯:運(yùn)行時(shí)刻.
Objective-C是一門動(dòng)態(tài)語(yǔ)言,運(yùn)行時(shí)會(huì)轉(zhuǎn)換成C語(yǔ)言.
例如:[object method];(編譯時(shí)) 
轉(zhuǎn)換成:objc_msgSend(object, @selector(method));(運(yùn)行時(shí))
場(chǎng)景一:
 [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
當(dāng)你沒(méi)寫click方法的時(shí)候,編譯的時(shí)候會(huì)提示找不到click方法.
當(dāng)你運(yùn)行的時(shí)候,點(diǎn)擊按鈕,程序會(huì)崩潰.
崩潰之前程序做了幾件事情.
1.在擁有btn類的方法緩存列表中找了一遍是否有這個(gè)方法(方法緩存簡(jiǎn)介:方法緩存是為了優(yōu)化性能,而優(yōu)化是永無(wú)止境的.鏈接:http://www.cocoachina.com/ios/20150818/13075.html)
2.在擁有btn類的父類中查找一遍是否有該方法.
3.在擁有btn類的根類中查找一遍是否有該方法.
4.看是否有攔截調(diào)用的方法.
123我們不考慮,4是runtime入門的一個(gè)點(diǎn).
+ (BOOL)resolveInstanceMethod:(SEL)sel;

這樣點(diǎn)擊,程序沒(méi)有崩潰.
假設(shè)程序響應(yīng)命令是0轉(zhuǎn)變?yōu)?的過(guò)程,我們知道了是可以在這個(gè)過(guò)程里做一些事情的.
例如:交換點(diǎn)擊事件(這樣做并沒(méi)有意義,只是舉個(gè)例子),A按鈕的點(diǎn)擊卻實(shí)現(xiàn)的B按鈕的點(diǎn)擊事件
交換的原理是:交換指針指向
運(yùn)行時(shí)交換方法,有點(diǎn)像面向切面編程(動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程)
但是我覺(jué)得交換方法特別容易亂,交換完要換回來(lái),除非你打算交換完就不換回來(lái),一直使用,不過(guò)那樣就失去了交換的意義.

建議大家看看Mattt Thompson(AFNetwoking的創(chuàng)作者/維護(hù)者)
寫的Method Swizzling:http://nshipster.cn/method-swizzling
專門講述了方法交換以及注意的點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容