runtime.
中文翻譯:運(yùn)行時(shí)刻.
Objective-C是一門動(dòng)態(tài)語言,運(yùn)行時(shí)會(huì)轉(zhuǎn)換成C語言.
例如:[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)你沒寫click方法的時(shí)候,編譯的時(shí)候會(huì)提示找不到click方法.
當(dāng)你運(yùn)行的時(shí)候,點(diǎn)擊按鈕,程序會(huì)崩潰.
崩潰之前程序做了幾件事情.
1.在擁有btn類的方法緩存列表中找了一遍是否有這個(gè)方法(方法緩存簡(jiǎn)介:方法緩存是為了優(yōu)化性能,而優(yōu)化是永無止境的.鏈接: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)擊,程序沒有崩潰.
假設(shè)程序響應(yīng)命令是0轉(zhuǎn)變?yōu)?的過程,我們知道了是可以在這個(gè)過程里做一些事情的.
例如:交換點(diǎn)擊事件(這樣做并沒有意義,只是舉個(gè)例子),A按鈕的點(diǎn)擊卻實(shí)現(xiàn)的B按鈕的點(diǎn)擊事件
交換的原理是:交換指針指向
運(yùn)行時(shí)交換方法,有點(diǎn)像面向切面編程(動(dòng)態(tài)地將代碼切入到類的指定方法如叼、指定位置上的編程思想就是面向切面的編程)
但是我覺得交換方法特別容易亂,交換完要換回來,除非你打算交換完就不換回來,一直使用,不過那樣就失去了交換的意義.
建議大家看看Mattt Thompson(AFNetwoking的創(chuàng)作者/維護(hù)者)
寫的Method Swizzling:http://nshipster.cn/method-swizzling
專門講述了方法交換以及注意的點(diǎn)