1. 程式人生 > >iOS的訊息轉發機制

iOS的訊息轉發機制

訊息轉發機制

假設說我們宣告一個類, 初始化物件, 並且在此類宣告一個方法, 呼叫方法的時候底層是怎麼處理的呢? 今天我們來簡單模擬測試, 來看道理髮生了什麼

以下是呼叫方法處理的方案圖, 按照方案順序去處理

以下是系統方法

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));