runtime.
中文翻譯:運行時刻.
Objective-C是一門動態語言,運行時會轉換成C語言.
例如:[object method];(編譯時)
轉換成:objc_msgSend(object, @selector(method));(運行時)
場景一:
[btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
當你沒寫click方法的時候,編譯的時候會提示找不到click方法.
當你運行的時候,點擊按鈕,程序會崩潰.
崩潰之前程序做了幾件事情.
1.在擁有btn類的方法緩存列表中找了一遍是否有這個方法(方法緩存簡介:方法緩存是為了優化性能,而優化是永無止境的.鏈接:http://www.cocoachina.com/ios/20150818/13075.html)
2.在擁有btn類的父類中查找一遍是否有該方法.
3.在擁有btn類的根類中查找一遍是否有該方法.
4.看是否有攔截調用的方法.
123我們不考慮,4是runtime入門的一個點.
+ (BOOL)resolveInstanceMethod:(SEL)sel;
這樣點擊,程序沒有崩潰.
假設程序響應命令是0轉變為1的過程,我們知道了是可以在這個過程里做一些事情的.
例如:交換點擊事件(這樣做并沒有意義,只是舉個例子),A按鈕的點擊卻實現的B按鈕的點擊事件
交換的原理是:交換指針指向
運行時交換方法,有點像面向切面編程(動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程)
但是我覺得交換方法特別容易亂,交換完要換回來,除非你打算交換完就不換回來,一直使用,不過那樣就失去了交換的意義.
建議大家看看Mattt Thompson(AFNetwoking的創作者/維護者)
寫的Method Swizzling:http://nshipster.cn/method-swizzling
專門講述了方法交換以及注意的點