iOS runtime隨筆-消息轉發機制

運行時的消息轉發分三步, 當你調用了沒有實現的方法時, 有機會通過runtime的消息轉發機制補救一下

  1. resolveInstanceMethod/resolveClassMethod 這里可以動態去創建方法來解決Crash
  2. forwardingTargetForSelector ?????第一步未解決, 就會走到這里, 可以給出一個Target去轉發這個消息(方法調用)
  3. forwardInvocation ???????上面2步都沒有解決問題, 這里是最后一次機會, 利用methodSignatureForSelector返回一個方法簽名, 在forwardInvocation中轉發給對應的target

實例方法實現參考

+ (BOOL)resolveInstanceMethod:(SEL)sel {if (sel == @selector(testInstance)) {IMP imp = class_getMethodImplementation([self class], @selector(test));return class_addMethod([self class], sel, imp, "v@:");}return NO;
}- (id)forwardingTargetForSelector:(SEL)aSelector {if (aSelector == @selector(testInstance)) {return self.realObj;}return [super forwardingTargetForSelector:aSelector];
}- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {if (aSelector == @selector(testInstance)) {return [[RealTestObject alloc] methodSignatureForSelector:aSelector];}return [super methodSignatureForSelector: aSelector];
}- (void)forwardInvocation:(NSInvocation *)anInvocation {SEL sel = anInvocation.selector;if ([self.realObj respondsToSelector:sel]) {[anInvocation invokeWithTarget:self.realObj];return;}[super forwardInvocation:anInvocation];
}

類方法實現參考

+ (BOOL)resolveClassMethod:(SEL)sel {if (sel == @selector(testClass)) {
//也可以通過block創建一個IMP去替代方法實現
//        IMP imp = imp_implementationWithBlock(^(void) {
//            NSLog(@"imp_implementationWithBlock");
//        });IMP imp = class_getMethodImplementation(objc_getMetaClass("TestObject"), @selector(testLogClass));class_addMethod(objc_getMetaClass("TestObject"), sel, imp, "v@:");return YES;}return NO;
}+ (id)forwardingTargetForSelector:(SEL)aSelector {if (aSelector == @selector(testClass)) {return [RealTestObject class];}return [super forwardingTargetForSelector:aSelector];
}+ (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {if (aSelector == @selector(testClass)) {return [RealTestObject methodSignatureForSelector:aSelector];}return [super methodSignatureForSelector:aSelector];
}+ (void)forwardInvocation:(NSInvocation *)anInvocation {SEL sel = anInvocation.selector;if (sel == @selector(testClass)) {[anInvocation invokeWithTarget:[RealTestObject class]];return;}[super forwardInvocation:anInvocation];
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86366.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3用js+css實現輪播圖(可調整堆疊程度)

先看效果 html <divclass"outer"style"width: 650px;background: #fff;box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.1);border-radius: 15px;margin: 0 10px 15px 5px;">//這里用的是svg-icon,需要的可自行替換為其他圖片<svg-iconid"btn_l&q…

Three.js項目實戰:從零搭建小米SU7三維汽車

大家如果有過購車的經驗&#xff0c;肯定會先從網站上收集車輛的信息&#xff0c;比如懂車帝&#xff0c;汽車之家&#xff0c;這些網站上逼真的看車效果是如何實現的呢&#xff0c;這節課帶你從0-1快速的手搓一個看車小項目。 懂車帝官網 效果 視頻教程和筆記 大家可以下方小…

Android13 永久關閉SELinux 權限

永久關閉 SeLinux 在cmdline中增加參數androidboot.selinuxpermissive&#xff1b; 芯片: QCM6115 版本: Android 13 kernel: msm-4.19 ~/temp_code/SLM927D_LA.UM.9.15$ git diff device/qcom/bengal/BoardConfig.mk diff --git a/device/qcom/bengal/BoardConfig.mk b…

Linux創建DHCP服務

Linux可作為DHCP服務端使用&#xff0c;為同一個網絡下的其它機器動態分配ip。在一些情況下&#xff0c;可以起到很大的作用。 二級標題 安裝dnsmasq # ubuntu sudo apt update -y sudo apt install -y dnsmasq# centos sudo yum install -y dnsmasq修改配置文件 sudo vim …

汽車4G-TBOX智能終端 汽車國標GB/T 32960協議

汽車國標GB/T 32960協議4G TBOX是一種廣泛應用于車聯網的設備&#xff0c;下面將從不同方面為你詳細介紹。 移動管家汽車4G-TBOX智能終端定義與用途 4G TBOX是基于車聯網技術智能服務系統中的采集終端。以車云網的4G TBOX_CC750為例&#xff0c;它為整個智能服務系統提供GPS/…

JavaEE-Mybatis初階

什么是MyBatis MyBatis是?款優秀的 持久層 框架&#xff0c;?于簡化JDBC的開發。 MyBatis本是 Apache的?個開源項?iBatis&#xff0c;2010年這個項?由apache遷移到了google code&#xff0c;并 且改名為MyBatis 。2013年11?遷移到Github 創建項目時添加依賴 上面有…

記一次jvm機器問題定位經歷

背景 開發過程中發現機器指標異常&#xff0c;端口也hang住無響應&#xff0c;端口返回為timeout&#xff0c;對應探活檢測也失敗了。 現象 在st測試環節&#xff0c;突然每隔一段時間新接口就hang住無響應&#xff0c;觀察機器監控也發現端口探活失敗&#xff0c;看機器指標…

【機器學習深度學習】張量基本操作

目錄 一、張量基本操作 1.1 執行代碼 1.2 運行結果 1.3 代碼解析 ? 1. 創建張量&#xff08;tensor、randn、zeros&#xff09; ? 2. 索引與切片&#xff08;類似 NumPy&#xff09; ? 3. 形狀變換&#xff08;reshape、轉置、壓縮&#xff09; ? 4. 數學運算&#x…

【微信小程序】8、獲取用戶當前的地理位置

1、獲取當前的地理位置 獲取當前的地理位置、速度。當用戶離開小程序后&#xff0c;此接口無法調用。開啟高精度定位&#xff0c;接口耗時會增加&#xff0c;可指定 highAccuracyExpireTime 作為超時時間。 注意&#xff1a; 地圖相關使用的坐標格式應為 gcj02。高頻率調用會…

Jenkins 常用定時構建腳本

Jenkins 常用定時構建腳本 Jenkins 使用 cron 風格的語法來配置定時構建任務&#xff0c;以下是常用的定時構建腳本示例和說明&#xff1a; 基本語法 Jenkins 定時構建使用五個字段表示時間&#xff0c;格式為&#xff1a; MINUTE HOUR DOM MONTH DOWMINUTE - 分鐘 (0-59)H…

ActiveMQ漏洞復現

以下內容均在nextcyber靶場環境中完成&#xff0c;請勿用于非法途徑&#xff01; ActiveMQ 反序列化漏洞&#xff08;CVE-2015-5254&#xff09; Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息…

環保處理設備遠程運維管理解決方案

在環保產業蓬勃發展的當下&#xff0c;環保處理設備廠商面臨著愈發激烈的市場競爭。為助力環保處理設備廠商在競爭中脫穎而出&#xff0c;御控工業智能網關打造了一套完善的PLC數據采集設備運維管理平臺解決方案。此方案憑借其獨特優勢&#xff0c;能為環保處理設備廠商帶來顯著…

嵌入式學習筆記DAY43(ARM架構)

一、RAM分類 sram&#xff08;靜態隨機存取存儲器&#xff09;&#xff1a; 原理&#xff1a;使用晶體管來存儲二進制數據0和1&#xff0c;通過雙穩態電路&#xff08;由多個晶體管組成&#xff09;來保持數據狀態&#xff0c;只要持續供電&#xff0c;數據就能穩定保存。數據讀…

2025國際無人機應用及防控大會四大技術專題深度解析

2025國際無人機應用及防控大會四大技術專題深度解析 2025國際無人機應用及防控大會四大技術專題深度解析1 無人機系統技術專題技術特點與應用領域國內領軍企業及案例風險挑戰與發展方向 2 測控與通信導航技術專題技術創新與應用突破領先企業及解決方案現存問題與發展趨勢 3 任務…

DD3118S:USB3.0+Type-c雙頭TF/SD二合一高速0TG多功能手機讀卡器ic

DD3118S封裝是QFN42, GL3224封裝是QFN32 &#xff0c;設計同樣一款3.0讀卡方案&#xff0c;GL3213S需要電容、電阻外圍器件一起要29顆&#xff0c;而DD3118S只需要13顆&#xff0c;方案精簡且設計簡單 DD3118S支持USB3.0Type-c雙頭TF/SD二合一 &#xff0c;高速0TG多功能手機讀…

如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄?

title: 如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方認證集成通過OAuth2.0授權碼流程實現,包含用戶跳轉GitHub認證、獲取授權碼、交換訪問令牌及調用API獲取用戶信息四…

深入JVM:從零到實戰,解鎖Java性能與調優的終極武器

“什么&#xff1f;你還在寫CRUD&#xff1f;面試官問個JVM調優直接啞火&#xff1f;線上服務OOM了只能重啟大法&#xff1f;” —— 別慌&#xff0c;掌握JVM&#xff0c;你也能成為團隊里的“定海神針”&#xff01; 作為一名Java開發者&#xff0c;無論你是剛入行的新人還是…

MyBatis 中的 resultType 與 resultMap:區別、使用場景及示例詳解

目錄 一、什么是 resultType 1. 定義 2. 特點 3. 使用場景 4. 示例 示例 1&#xff1a;返回一個實體類對象 對應的 Java 類&#xff1a; 示例 2&#xff1a;返回 Map 集合 返回的每個記錄是一個 Map&#xff0c;例如&#xff1a; 二、什么是 resultMap 1. 定義 2. …

Mac安裝Apache CXF的時候報錯:/Library/Internet: No such file or directory

該問題的原因因為配置的JAVA_HOME環境變量路徑中的包括空格字符導致的錯誤。 一、問題排查 輸出當前環境變量 $JAVA_HOME的路徑地址&#xff0c;觀察路徑中是否存在空格 echo $JAVA_HOME二、問題解決 將JAVA_HOME路徑改為你安裝的jdk路徑&#xff0c;注意你的版本號可能與我的會…

npm(或pnpm)時報:證書過期 certificate has expired問題

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 首先安裝pnpm npm install -g pnpm //檢查安裝成功的版本 pnpm -v 在拉芋道管理系統&#xff0c;安裝依賴pnpm i 時報證書過期 更改了鏡像也一樣 解決方案&#xff1a; 提示&#xff1a;這里填寫該…