iOS的訊息轉發機制
阿新 • • 發佈:2019-02-05
訊息轉發機制
假設說我們宣告一個類, 初始化物件, 並且在此類宣告一個方法, 呼叫方法的時候底層是怎麼處理的呢? 今天我們來簡單模擬測試, 來看道理髮生了什麼
以下是呼叫方法處理的方案圖, 按照方案順序去處理
以下是系統方法
1 2 3 4 5 6 7 8 9 |
//訊息轉發
//- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
//標準的訊息轉發 //- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE("");
//- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");
//
//動態方法解析
//+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
//+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
Demo解析
基礎步驟
建立類, Person類, 宣告方法, 並且在ViewController進行初始化呼叫
1 2 3 4 5 |
VC中
Person *person = [Person new ];
[person run];
Person類中
- ( void )run; //沒有實現
|
此時執行是不是會報錯呢? 就是這個常見的錯誤
“ - [Person run]: unrecognized selector sent to instance 0x600000008310’ “
那麼這樣做到底發生了什麼? 做了哪些事情? 我們一步步來剖析
動態測試
在Presenter類中, 寫動態方法
1 2 3 4 |
+ (BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@ "sel = %@" ,NSStringFromSelector(sel));
return [ super resolveInstanceMethod:sel];
}
|
再次執行Demo就會走到這個方法中, 也就是我們所指的方案1, 此時打印出來的scl為” 訊息轉發機制Demo[41829:4186268] sel = run “
解析模擬
1 2 3 4 5 6 7 8 9 |
+ (BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@ "sel = %@" ,NSStringFromSelector(sel));
|