1. 程式人生 > >iOS 訊息轉發機制(附程式碼)

iOS 訊息轉發機制(附程式碼)

在iOS中,如果遇到訊息無法處理。比如:

通過

- (id)performSelector:(SEL)aSelector;

呼叫了一個方法

但是沒有實現它。對它發生呼叫後,系統找不到執行該函式的地方。在系統發生cash之前,會先啟動訊息轉發機制。試圖對該訊息進行處理。

動態訊息解析

+ (BOOL)resolveInstanceMethod:(SEL)sel;

在本類內部尋找選擇子sel 的方法;

+ (BOOL)resolveInstanceMethod:(SEL)sel{
    if (sel == @selector(eat)) {
            class_addMethod(self, sel, (IMP
)eatMeat, "[email protected]:@:"); return YES; } return [super resolveInstanceMethod:sel]; }

用這個方法的前提是本類內部已經實現了eatMeat方法。如果eatMeat依然不存在,則會進入 備援接受者尋找處理方法。

備援接收者

如果本類動態方法解析無法處理則可以把處理方法交給其他接受者。在forwordingTargetForSelector方法中重新初始化一個類,並該類中呼叫該方法,前提是該類中有這個方法。如果處理不了,會向父類去尋找該方法,直到NSObject。如果備援接受者確定處理不了該方法,將會進入完整的訊息轉發。

- (id)forwordingTargetForSelector:(SEL)aSelector;

- (id)forwardingTargetForSelector:(SEL)aSelector{
    NSString *selectorStr = NSStringFromSelector(aSelector);//獲取訊息的選擇子
    if ([selectorStr isEqualToString:@"eat"]) {
        AnimalForwardingTarget *action = [AnimalForwardingTarget new];
        return
action; } return [super forwardingTargetForSelector:aSelector]; }

完整的訊息轉發

生成方法簽名

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector;

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector{
    NSString *selectedStr = NSStringFromSelector(aSelector); //獲取訊息的選擇子
    if ([selectedStr isEqualToString:@"eat"]) {
        NSMethodSignature *sign = [NSMethodSignature signatureWithObjCTypes:"[email protected]:@"];
        return sign;
    }
    return [super methodSignatureForSelector:aSelector];
}

利用簽名生成NSInnovation

- (void)forwardInvocation:(NSInvocation *)anInvocation{
    NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:"[email protected]:@"]; //利用簽名生成NSInnovation
    anInvocation = [NSInvocation invocationWithMethodSignature: signature];
    [anInvocation setTarget: self];
    anInvocation.selector = NSSelectorFromString(@"eatDogFood");
    AnimalForwardInvocation* animalInvocation = [AnimalForwardInvocation new];
    if ([animalInvocation respondsToSelector:[anInvocation selector]]) {     //如果AnimalForwardInvovation這個類中實現了選擇子eatDogFood
        [anInvocation invokeWithTarget: animalInvocation];                    
    } else {
        [super forwardInvocation: anInvocation];
    }
}

如果連完整的訊息轉發也處理不了該方法,系統會發生cash.

相關推薦

iOS 訊息轉發機制(程式碼)

在iOS中,如果遇到訊息無法處理。比如:通過- (id)performSelector:(SEL)aSelector;呼叫了一個方法但是沒有實現它。對它發生呼叫後,系統找不到執行該函式的地方。在系統發生cash之前,會先啟動訊息轉發機制。試圖對該訊息進行處理。動態訊息解析+

iOS runtime探究(二): 從runtime開始深入理解OC訊息轉發機制

你要知道的runtime都在這裡 本文主要講解runtime相關知識,從原理到實踐,由於包含內容過多分為以下五篇文章詳細講解,可自行選擇需要了解的方向: 本文是系列文章的第二篇文章從runtime開始: 深入理解OC訊息轉發機制,主要從runtime

iOS訊息轉發機制

訊息轉發機制 假設說我們宣告一個類, 初始化物件, 並且在此類宣告一個方法, 呼叫方法的時候底層是怎麼處理的呢? 今天我們來簡單模擬測試, 來看道理髮生了什麼 以下是呼叫方法處理的方案圖, 按照方案順序去處理 以下是系統方法

ios runtime IMP指標 訊息轉發機制

本文程式碼是根據訊息轉發機制來寫的, 有不妥之處, 請大神指正 1. UIViewController (ViewDidLoadName)檔案 UIViewController的c

Android--利用Handler訊息轉發機制實現倒計時(內含防止記憶體洩露處理)

真正學會Handler必須要了解的相關概念 相關概念圖示: Message:儲存資訊的物件,被Handler線上程間轉發,實現執行緒間的通訊。 MessageQueue:以有序的方式排列的,等待處理的事件(Runnable或者Message)。

oc訊息轉發機制

Class 型別物件 OC本身是一種強型別語言,但其執行時功能讓它又有了動態語言的特點。OC中物件的型別和物件所執行的方法都是在執行時階段進行查詢並確認的,這種機制被稱為動態繫結。想要弄清楚執行時如何能夠實現動態繫結機制,首先要了解OC中物件的本質。 OC

理解訊息傳遞機制訊息轉發機制

訊息傳遞機制 在物件上傳遞方法叫做“傳遞訊息”(pass a message)。訊息有“名稱”(name)或“選擇子”(selector),可以接受引數,而且可能還有返回值。 在Object-c中,如果向物件傳遞訊息,那就會使用動態繫結機制來決定需要呼叫的方

OC學習Runtime之訊息傳遞,訊息轉發機制

堅持 成長 每日一篇 相關類和函式 介紹訊息傳送機制之前介紹一下會用到的幾個相關類和函式 NSMethodSignature(方法簽名) 方法簽名:用語記錄一個方法的引數和返回值型別的類。類似於objc_method_description結構體。方

iOS runtime探究(二): 從runtime開始深入理解OC消息轉發機制

phoenix face exp nslog void string ams ber 解釋 你要知道的runtime都在這裏 轉載請註明出處 http://blog

iOS訊息推送機制

  Little_Dragon  關注 2015.10.05 22:33*  字數 1253  閱讀 17337 評論 36 喜歡 151 推送

VC++/MFC訊息對映機制(4)::鉤子函式原理

VC++/MFC訊息對映機制(4):附:鉤子函式原理 若對C++語法不熟悉,建議參閱《C++語法詳解》一書,電子工業出版社出版,該書語法示例短小精悍,對查閱C++知識點相當方便,並對語法原理進行了透徹、深入詳細的講解。 一、鉤子SetWindowsHookEx 注意:本文的鉤子和

OC的訊息傳送以及轉發機制

SEL:Objective-C在編譯時,會依據每一個方法的名字、引數序列,生成一個唯一的整型標識(Int型別的地址),這個標識就是SEL.本質上,SEL只是一個指向方法的指標. Method:Method = SEL + IMP + method_types,相當於在SEL和IMP之間建立

iOS探索:Runtime之訊息轉發及動態新增方法

在開始之前,我們先來了解下OC中的類與物件 這是一張經典的類的關係示意圖,接下來簡單的介紹一下這張圖 首先當我們建立一個實力物件,會拷貝這個實力物件所屬類的成員變數,但是不會拷貝類定義的方法 當我們傳送訊息給例項物件時,會通過這個例項物件中的isa指標去找到它對應的類,在

【精】iOS知識樹,知識點(包括物件、Block、訊息轉發、GCD、執行時、runloop、動畫、Push、KVO、tableview,UIViewController、提交AppStore)

        本文旨在總結iOS知識網路,知識點,該知識網路羅列出常見UIKit、Foundation的物件特點和一些使用經驗,可以看成是一本書;文字編輯採用樹的形式,對知識點進行羅列,並標註一些使用經驗(★)希望對初學者有用或給一些解決疑難雜症者提供思路;某些知識點會深入

分享一個分散式訊息匯流排,基於.NET Socket Tcp的釋出-訂閱框架,程式碼下載

一、分散式訊息匯流排      在很多MIS專案之中都有這樣的需求,需要一個及時、高效的的通知機制,即比如當使用者A完成了任務X,就需要立即告知使用者B任務X已經完成,在通常的情況下,開發人中都是在使用者B所使用的程式之中寫資料庫輪循程式碼,這樣就會產品一個很嚴重的兩個問題,第一個問題是延遲,輪循機制要定時

分散式訊息匯流排,基於.NET Socket Tcp的釋出-訂閱框架之離線支援,程式碼下載

一、分散式訊息匯流排以及基於Socket的實現      在前面的分享一個分散式訊息匯流排,基於.NET Socket Tcp的釋出-訂閱框架,附程式碼下載一文之中給大家分享和介紹了一個極其簡單也非常容易上的基於.NET Socket Tcp 技術實現的分佈訊息匯流排,也是一個簡單的釋出訂閱框架:  

微信小程式實現轉發功能以及真機除錯跳坑(程式碼)

前置知識可先閱覽以下博文 https://blog.csdn.net/xiaochun365/article/details/76546585 https://blog.csdn.net/xiaochun365/article/details/76546585   先在

IOS NSNotificationCenter訊息通訊機制介紹

訊息傳送機構:舉例說明 在有需要的類中,傳送訊息 //傳送訊息出去,這裡的物件是一個數組:saveImageArray [[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];

一起學習EOS|深入理解EOS的賬戶及其許可權機制程式碼

在上一篇 EOS的命令列程式和工具超詳細實戰演習 中。我們學習了EOS錢包的工作原理。學會了如何自己建立私鑰公鑰,以及如何用錢包管理私鑰。 今天,繼續引入EOS中一個非常重要的概念:賬戶。最終,我們會把這些元素放在一起理解。EOS錢包 、 私鑰公鑰 、 賬

JS&iOS原生互動 程式碼地址

關於原生和hybid之爭,這裡不做探討.主要講講JS和OC互動 OC執行JS程式碼 1.stringByEvaluatingJavaScriptFromString 這個方法是UIWebView裡面的方法,也是最為簡單的和JS互動的方式- (nullable