天天看點

IOS消息傳遞轉發機制

消息轉發分為兩階段,第一階段先征詢接受者,所屬的類,看起能否動态添加方法,已處理目前這個“未知的方法”,這叫做動态解析方法。第二階段涉“完整的消息轉發機制”,如果運作期系統已經把第一階段執行完成,納悶接受者自己以其他手段處理與消息相關的方法調用。這又細分為兩部,首先,請接受者看看有沒有其他對象能處理這條消息,若有,這運作其系統會把消息轉給那個對象,消息轉發過程結束,若沒有“備用接收者”,則啟動完整的消息轉發機制,運作期系統會把與消息有關的全部細節都封裝到NSInvocation對象中,再給接收者最後一次機會,令其解決目前還未處理的消息。

動态方法解析

對象在收到無法解析的消息後,首先調用其所屬類的下列類方法:

+(BOOL)resolveInstanceMethod:(SEL)sel

該方法參數就是一個未知的選擇子,其傳回值為Boolean類型,表示這個類是否能新增一個實力方法用以處理改選擇子。在繼續往下執行轉發之前,本類有機會新增一個處理此選擇子的方法。加入尚未實作的方法不是執行個體方法而是類方法,那麼運作期系統就會調用另一個方法

+(BOOL)resolveClassMethod:(SEL)sel

使用這種方法的前提是:相關方法的代碼已經寫好,隻等運作的時候動态插在類裡面就可以

備援接受者

目前接受者還有第二次機會能處理位置的選擇子,在這一部中,運作期系統會問它能不能把消息轉給其他接受者來處理,對應的處理方法如下:

-(id)forwardingTargetForSelector:(SEL)aSelector

方法參數代表未知的選擇子,若目前接受者能找到備援對象,則将其傳回,若找不到,就傳回nil,通過這個方法,可以用“組合”來模拟出“多重繼承”的某些特性

完整的消息轉發

使用

-(void)forwardInvocation:(NSInvocation *)anInvocation

方法,實作此方法時,如發現某調用操作不應該由本類處理,則需要調用超類的同名方法,直至NSobject,如果最後調用了nsobject類的方法,那麼改方法會繼而調用“doesNotRecognizeSelector:”以抛出異常,表明未處理

繼續閱讀