精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS消息轉發機制Demo解析

移動開發
假設說我們聲明一個類, 初始化對象, 并且在此類聲明一個方法, 調用方法的時候底層是怎么處理的呢? 今天我們來簡單模擬測試, 來看道理發生了什么?

假設說我們聲明一個類, 初始化對象, 并且在此類聲明一個方法, 調用方法的時候底層是怎么處理的呢? 今天我們來簡單模擬測試, 來看道理發生了什么

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

以下是系統方法 

  1. //消息轉發 
  2. //- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 
  3. //標準的消息轉發 
  4. //- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); 
  5. //- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); 
  6. // 
  7. //動態方法解析 
  8. //+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 
  9. //+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 

Demo解析

基礎步驟

創建類, Person類, 聲明方法, 并且在ViewController進行初始化調用 

  1. VC中 
  2. Person *person = [Person new]; 
  3. [person run]; 
  4. Person類中 
  5. - (void)run;//沒有實現 

此時運行是不是會報錯呢? 就是這個常見的錯誤

“ - [Person run]: unrecognized selector sent to instance 0x600000008310’ “

那么這樣做到底發生了什么? 做了哪些事情? 我們一步步來剖析

動態測試

在Presenter類中, 寫動態方法 

  1. + (BOOL)resolveInstanceMethod:(SEL)sel{ 
  2. NSLog(@"sel = %@",NSStringFromSelector(sel)); 
  3. return [super resolveInstanceMethod:sel]; 

再次運行Demo就會走到這個方法中, 也就是我們所指的方案1, 此時打印出來的scl為” 消息轉發機制Demo[41829:4186268] sel = run “

解析模擬 

  1. + (BOOL)resolveInstanceMethod:(SEL)sel{ 
  2. NSLog(@"sel = %@",NSStringFromSelector(sel)); 
  3. //1.判斷沒有實現方法, 那么我們就是動態添加一個方法 
  4. if (sel == @selector(run:)) { 
  5. class_addMethod(self, sel, (IMP)newRun, "v@:@:"); 
  6. return YES; 
  7. return [super resolveInstanceMethod:sel]; 

聲明函數 

  1. void newRun(id self,SEL sel,NSString *str) { 
  2. NSLog(@"---runok---%@",str); 

溫馨小提示, 動態添加方法參數意譯 : //將要添加方法的類/sel名/IMP函數指針<添加函數>, 官方文檔其實是有解釋的

此時我們再次運行, 那么打印結果就來了” 消息轉發機制Demo[43269:4212899] —runok—ok跑 “, 這樣的話我們就解決掉了報錯這個問題

消息轉發重定向測試

此時我們新創建一個類Mbxb, 此時我們還是重新寫一個同名字的方法run方法, 并且進行實現 

  1. - (void)run{ 
  2. NSLog(@"---Mbxbrunok---"); 

解析

此時有兩個同樣的方法, 我們重新在Person類中

來實現方法 

  1. - (id)forwardingTargetForSelector:(SEL)aSelector{ 
  2. NSLog(@"aSelector = %@",NSStringFromSelector(aSelector)); 
  3. return [super forwardingTargetForSelector:aSelector]; 

此時運行測試, 動態測試輸出” 消息轉發機制Demo[45875:4255869] sel = run “, 消息轉發重定向輸出” 消息轉發機制Demo[45875:4255869] —Mbxbrunok— “, 同樣也可以找見方法run

當我們進行處理 

  1. - (id)forwardingTargetForSelector:(SEL)aSelector{ 
  2. NSLog(@"aSelector = %@",NSStringFromSelector(aSelector)); 
  3. return [[Mbxb alloc]init]; 

那么此時運行成功輸出, “ —Mbxbrunok— “

生成方法簽名轉發消息

此時我們在Person類中, 生成方法簽名 

  1. - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""){ 
  2. //轉化字符 
  3. NSString *sel = NSStringFromSelector(aSelector); 
  4. //判斷, 手動生成簽名 
  5. if([sel isEqualToString:@"run"]){ 
  6. return [NSMethodSignature signatureWithObjCTypes:"v@:"]; 
  7. }else
  8. return [super methodSignatureForSelector:aSelector]; 

拿到簽名 

  1. - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""){ 
  2. NSLog(@"---%@---",anInvocation); 
  3. return [super forwardInvocation:anInvocation]; 

此時我們的po的簽名輸出為” return value: {v} void target: {@} 0x600000016ba0 selector: {:} run “

拿到消息轉發簽名 

  1. - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""){ 
  2. NSLog(@"---%@---",anInvocation); 
  3. //取到消息 
  4. SEL seletor = [anInvocation selector]; 
  5. //轉發 
  6. Mbxb *bxb = [[Mbxb alloc]init]; 
  7. if([bxb respondsToSelector:seletor]){ 
  8. //調用對象,進行轉發 
  9. [anInvocation invokeWithTarget:bxb]; 
  10. }else
  11. return [super forwardInvocation:anInvocation]; 

小細節: 拋出異常

假如說我們沒有這個方法, 同樣是遇到會崩潰的問題

我們這里來進行一個異常處理 

  1. - (void)doesNotRecognizeSelector:(SEL)aSelector{ 
  2. NSString *selStr = NSStringFromSelector(aSelector); 
  3. NSLog(@"%@不存在",selStr); 

我們可以在這個異常處理中一些處理, 比如說彈框

總結

對于消息轉發機制, 我們重新來梳理一下Demo解析思路

還是三個方案, 按順序來走

  1. 動態方法解析
  2. 消息轉發重定向
  3. 生成方法簽名
  4. 拿到簽名轉發消息
  5. 細節處理, 拋出異常
  6. 最后獻上一張邏輯圖 

好了, 給大家這個簡單demo, 當然在代碼中也寫了注釋, 可以去我的git下載, 歡迎star

責任編輯:未麗燕 來源: Oboe_b
相關推薦

2023-10-13 10:44:35

OC消息發送

2024-09-25 08:32:05

2014-03-04 15:28:32

iOS開發消息傳遞機制

2011-05-31 11:55:00

Android 消息機制

2013-04-11 12:40:16

Android消息機制

2016-03-02 09:34:03

runtime消息ios開發

2011-02-21 15:17:45

Qmail

2013-12-16 09:44:01

OpenDayLighSDN網絡轉發

2011-07-01 15:04:49

Qt 內省

2024-10-29 08:34:27

RocketMQ消息類型事務消息

2024-11-11 13:28:11

RocketMQ消息類型FIFO

2011-04-07 17:54:22

Policing

2011-08-02 18:07:03

iPhone 內省 Cocoa

2017-08-17 15:13:52

PostgreSQL MVCC機制

2011-11-23 09:39:33

JavaClassLOader機制

2010-08-13 14:19:44

Flex綁定機制

2024-11-14 09:10:13

消費者RocketMQ負載均衡

2011-04-07 17:27:52

Policing

2011-04-07 17:39:57

Shapping

2011-04-07 17:43:37

Shapping
點贊
收藏

51CTO技術棧公眾號

性猛交娇小69hd| 日本中文字幕网址| 99精品在线看| 亚洲国产一区二区三区高清| 日韩精品中文在线观看| 美女网站免费观看视频| av在线看片| 91丨porny丨最新| 国产精品视频网| 久久久久久久国产精品毛片| 日韩在线影视| 91麻豆精品久久久久蜜臀| 国产欧美日韩网站| 日本不卡不卡| 91麻豆免费在线观看| 91免费观看网站| 国产精品久免费的黄网站| 91精品一区二区三区综合| 亚洲国产欧美一区二区三区同亚洲| 国产一级不卡毛片| heyzo高清中文字幕在线| 国产三级一区二区| 国产精品一区二区三区在线 | 婷婷一区二区三区| 在线不卡日本| 美国成人毛片| 国产成人av电影免费在线观看| 国产精品88a∨| 亚洲天堂日韩av| 欧美成人一区二免费视频软件| 亚洲人午夜精品免费| 在线中文字日产幕| 久久精品一级| 欧美日韩一区小说| 精品久久久久久久无码| 亚洲男人av| 亚洲 欧美综合在线网络| av电影一区二区三区| 国产天堂素人系列在线视频| av不卡一区二区三区| 91精品久久香蕉国产线看观看| 中国一级特黄视频| 久久婷婷av| 欧美性受xxxx黑人猛交| 欧美日韩中文字幕在线| 国产精品五月天| 国产精品免费在线播放| 国产精品久久久久久久成人午夜| 日韩精品91亚洲二区在线观看| 97成人精品区在线播放| 久久精品国产亚洲AV无码麻豆| 91精品高清| 精品国产网站地址| 日本黄色录像视频| 四虎8848精品成人免费网站| 中文字幕欧美国内| 国产真人真事毛片视频| 欧美性感美女一区二区| 社区色欧美激情 | 少妇高潮惨叫久久久久| 99久久国产综合精品成人影院| 一区二区三区四区视频| 久久久久99精品成人| 日韩免费在线| 久久精品亚洲94久久精品| 国产乱子轮xxx农村| 国产精品成人av| 免费不卡在线观看av| 欧美日韩中文字幕在线观看| 韩日在线一区| 2019中文在线观看| 免费av中文字幕| 蜜桃av噜噜一区| 91久久久久久久| 亚洲AV无码国产精品午夜字幕| 国产99精品视频| 精品欧美一区二区精品久久| 免费在线视频一级不卡| 国产欧美一区二区精品秋霞影院| 一区二区三区久久网| av毛片在线| 亚洲成人激情综合网| 精品免费国产一区二区| jizz欧美| 欧美大片免费久久精品三p| 成人在线电影网站| 精品av一区二区| 久久久999精品| 精品肉丝脚一区二区三区| 亚洲主播在线| 成人免费网视频| 色窝窝无码一区二区三区成人网站| 91久色porny| 亚洲在线不卡| 3344国产永久在线观看视频| 日本道精品一区二区三区| 国产性生活一级片| 宅男在线一区| 久久国产精品免费视频| 久久免费激情视频| 韩国成人精品a∨在线观看| 国产超碰91| 欧洲一区av| 亚洲女人的天堂| aaaaaa亚洲| 精品国产18久久久久久二百| 精品视频久久久久久| 久久高清内射无套| 国产精品呻吟| 91视频99| 一区二区三区视频网站 | www青青草原| 鲁大师影院一区二区三区| 91在线观看免费高清| 人操人视频在线观看| 亚洲精品综合在线| 男人插女人下面免费视频| 网站一区二区| 综合136福利视频在线| 国产无套在线观看| 国产乱码一区二区三区| 涩涩涩999| 中文在线8资源库| 精品国产欧美一区二区| 亚洲 欧美 变态 另类 综合| 久久久精品性| 国产一区二区中文字幕免费看| 黄网站免费在线观看| 欧美综合一区二区| 最新中文字幕视频| 亚洲精品色图| 成人综合av网| 日本一本在线免费福利| 欧美午夜不卡在线观看免费| 久久久亚洲av波多野结衣| 在线看片日韩| 成人在线免费观看一区| 午夜影院免费在线| 欧美一区二区三区小说| 黑人狂躁日本娇小| 毛片基地黄久久久久久天堂| 午夜精品福利一区二区| 户外露出一区二区三区| 日韩精品亚洲视频| 天堂在线免费观看视频| 91丨porny丨国产| 少妇无码av无码专区在线观看| 97se亚洲国产一区二区三区| 欧美老少做受xxxx高潮| 国产wwwxxx| 悠悠色在线精品| 九九九久久久久久久| 亚洲天堂免费| 99影视tv| 国产在线看片免费视频在线观看| 精品国产乱子伦一区| 久久精品人妻一区二区三区| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 免费毛片小视频| 欧美毛片免费观看| 91av中文字幕| 国产理论电影在线观看| 欧美日韩在线精品一区二区三区激情 | 91亚洲永久精品| 中国丰满人妻videoshd| 国产精品一区高清| 国产精品专区第二| 91精品久久| 亚洲福利在线播放| 丰满少妇xoxoxo视频| 国产女人18毛片水真多成人如厕| 一级片视频免费观看| 91精品观看| 国产精品一区二区欧美黑人喷潮水| 松下纱荣子在线观看| 中文字幕日本欧美| 精品国产亚洲av麻豆| 亚洲成人tv网| 一级特黄曰皮片视频| 国产精品99久久久久久有的能看| 国产专区在线视频| 日韩美女毛片| 成人国产精品免费视频| 欧美大片黄色| 亚洲一区二区福利| 国产精品一区二区黑人巨大| 午夜久久久久久电影| 亚洲成人黄色av| 国产一区欧美日韩| 免费看一级大黄情大片| 91日韩在线| 久久国产精品 国产精品| 成人精品三级| 欧美极品少妇全裸体| 九色国产在线观看| 日韩一区二区影院| 免费黄色av片| 亚洲精品免费播放| 国产精品密蕾丝袜| 国产999精品久久| 国产精品一区二区小说| 在线播放不卡| 在线视频不卡一区二区三区| 久久综合社区| 91美女片黄在线观| 国产麻豆久久| 97视频在线观看免费高清完整版在线观看| 成人亚洲性情网站www在线观看| 91精品国产综合久久香蕉麻豆 | 精品网站在线看| 成人av在线播放| 日韩免费中文字幕| 国产高清中文字幕在线| 久久久极品av| 中文字幕在线播放| 亚洲精品午夜精品| 老熟妇高潮一区二区高清视频| 欧美日韩精品一区二区三区四区 | 精品av综合导航| 中文字幕在线观看高清| 色偷偷久久一区二区三区| 久久婷婷国产麻豆91| 一区免费观看视频| 中文字幕有码在线播放| 99精品视频一区| 日韩少妇一区二区| 国产大陆a不卡| 污污视频网站在线| 美女视频一区在线观看| 欧美视频第三页| 亚洲欧美日韩在线观看a三区 | 首页国产欧美久久| 午夜精品久久久久久久无码 | 777米奇影视第四色| 亚洲激情网址| 国产视频在线观看网站| 欧美fxxxxxx另类| 国产人妻人伦精品| 中文无码久久精品| 国产av不卡一区二区| 99精品在线观看| 正在播放亚洲| 一区二区影院| 成人一区二区av| 尤物在线精品| 欧美日韩在线一| 亚洲精品字幕| 成年人观看网站| 久久久久久色| 中文字幕第80页| 免费亚洲电影在线| 国产精品v日韩精品v在线观看| 日韩国产一区二| 亚洲欧美在线精品| 九九视频精品免费| 丰满少妇在线观看| 狠狠色狠狠色综合系列| 午夜影院免费观看视频| 国产高清精品久久久久| 免费黄色a级片| 91香蕉视频黄| 国产一区二区三区精品在线| 国产精品久久久久影院老司 | 亚洲人体av| 免费高清一区二区三区| 日韩午夜高潮| 国产天堂在线播放| 精品一区二区三区影院在线午夜 | 欧美精品一区在线播放| www.综合网.com| 热re91久久精品国99热蜜臀| 一区在线影院| 91最新在线免费观看| 国语一区二区三区| 青青成人在线| 亚洲天天综合| 鲁一鲁一鲁一鲁一澡| 蜜臀av一区二区| 麻豆精品国产传媒| 91小视频在线观看| jizzjizzjizz国产| 亚洲国产一二三| 无码人妻丰满熟妇区五十路 | 亚洲一区av在线| 久久国产黄色片| 欧美乱妇15p| 动漫av一区二区三区| 亚洲图片在区色| 羞羞的网站在线观看| 欧美一级成年大片在线观看| 精品久久毛片| 国产亚洲精品美女久久久m| 不卡中文字幕| 日韩欧美精品免费| 日本va欧美va瓶| 国产一级免费片| 国产精品不卡在线| 成人毛片在线播放| 日韩一区二区三区电影在线观看 | jazzjazz国产精品久久| 日本一区免费| 最新亚洲一区| 天堂av.com| 国产拍欧美日韩视频二区| 久久免费精彩视频| 欧美亚洲精品一区| 人妻少妇精品无码专区| 久久国内精品一国内精品| 亚洲天堂资源| 国产精品乱码一区二区三区| 国产国产精品| 日韩有码免费视频| 99精品视频一区二区| 欧美日韩精品在线观看视频| 欧美日韩一区二区三区视频| 日本福利片在线| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美婷婷在线| 手机在线视频一区| 国产欧美日韩不卡免费| 黄网在线观看视频| 亚洲成人激情视频| 天堂av最新在线| 91在线视频免费| 欧美gayvideo| 特级丰满少妇一级| 国产午夜精品福利| 国产成人无码一区二区在线播放| 亚洲精品一区二区三区福利| av大大超碰在线| 91网站在线看| 亚洲午夜精品一区 二区 三区| 在线观看免费不卡av| 国产精品美女久久久久av爽李琼| av首页在线观看| 亚洲天堂网站在线观看视频| 中文在线аv在线| 欧美激情论坛| 久久在线91| 成人午夜福利一区二区| 色综合久久久久综合体| 你懂的视频在线播放| 91av在线免费观看| 亚洲区小说区图片区qvod| 久久久久久久久久久视频| 91欧美一区二区| 日本视频在线观看免费| 亚洲男人天天操| 午夜精品久久久久久久久久蜜桃| 欧美aaaaa喷水| 日韩二区三区四区| 日韩欧美视频免费观看| 制服视频三区第一页精品| av色综合久久天堂av色综合在| 999国产视频| 极品中文字幕一区| 亚洲黄色在线网站| 欧美主播一区二区三区| 伊人在线视频| 91嫩草视频在线观看| 夜夜精品视频| 亚洲精品一区二区三区影院忠贞| 91久久人澡人人添人人爽欧美| 97人人在线| 亚洲aaa激情| 一本综合精品| www.99热| 日韩视频免费直播| 久久男人天堂| 新呦u视频一区二区| 国产乱妇无码大片在线观看| 成年人午夜视频| 国产亚洲精品久久久久久| 亚洲综合伊人| 国产一区二区网| 国产免费久久精品| 国产高清第一页| 欧美有码在线观看| 99久久99热这里只有精品| 精品人妻一区二区免费| 色网综合在线观看| 怡红院在线播放| 免费久久久一本精品久久区| 久久精品99国产精品| 国产午夜久久久| 在线中文字幕日韩| 日韩激情欧美| 大肉大捧一进一出好爽动态图| 亚洲人成亚洲人成在线观看图片| 欧洲av在线播放| 国产欧亚日韩视频| 99综合视频| 国产一区二区三区在线视频观看| 亚洲黄色www网站| 欧美日韩卡一| 波多野结衣家庭教师在线| 亚洲免费伊人电影| 国产特黄在线| 狠狠色噜噜狠狠色综合久 | 欧美在线免费观看亚洲|