iOS消息轉發流程

????????當向Objc對象發送消息時,如果找到對象對應的方法,就會進入消息轉發流程,給開發者提供一些最后的機會處理消息無法發送問題,以免出現程序崩潰。

? ? ??

????????1. 回調對象的resolveInstanceMethod方法,在這個方法中,允許開發者在運行時為指定對象添加一個方法,然后返回YES。

 // 重寫 resolveInstanceMethod: 嘗試添加對象方法實現
+ (BOOL)resolveInstanceMethod:(SEL)sel{if (sel == @selector(way)) {class_addMethod([self class],sel,class_getMethodImplementation([self class], @selector(method)), "123");//使用class_addMethod動態添加方法method}return YES;
}

? ? ? 2. 若用戶未重寫resolveInstanceMethod, 或者未能在重寫方法中正確處理,則將會調用對象的forwardingtargetForSelector方法,該方法允許用戶將消息轉發到一個可以接收該消息的其他對象。

//嘗試將消息轉發到一個新對象
if (aSelector == @selector(way)) {Friends *friends = [[Friends alloc]init];return friends;//返回friends對象,讓friends對象接受這個消息}return [super forwardingTargetForSelector:aSelector];
}

? ? ? ? 3. 若上一步仍然未能正確處理, 對象的methodsignnatureForSelector?&?forwardInvocation方法將會被調用,允許用戶在拋異常前進行最后的挽救

//最后一次嘗試對消息進行轉發,可嘗試多個轉發對象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{if (aSelector == @selector(way)) {return [NSMethodSignature methodSignatureForSelector:@selector(way)];}return [super methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation{SEL sel = anInvocation.selector;Friends *f = [[Friends alloc] init];if([f respondsToSelector:sel]) {   // 判斷 Person 對象方法是否可以響應 sel[anInvocation invokeWithTarget:f];  // 若可以響應,則將消息轉發給其他對象處理} else {[self doesNotRecognizeSelector:sel];  // 若仍然無法響應,則報錯:找不到響應方法}
}

????????4. 若消息仍未能正確處理,系統則會拋出unrecognized selector 異常

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

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

相關文章

阿里云定價_ECS產品價格_云服務器收費標準 - 阿里云官方活動

2024年最新阿里云服務器租用費用優惠價格表,輕量2核2G3M帶寬輕量服務器一年61元,折合5元1個月,新老用戶同享99元一年服務器,2核4G5M服務器ECS優惠價199元一年,2核4G4M輕量服務器165元一年,2核4G服務器30元3…

logo設計軟件及網站匯總

文章目錄 一、智能設計logo的網站二、常用的logo設計軟件 一、智能設計logo的網站 Canva:Canva是一個在線設計平臺,提供了豐富的模板和設計工具,可以幫助用戶輕松設計出專業水平的logo。 DesignEvo:DesignEvo是一個專業的在線log…

基于 LLaMA 和 LangChain 實踐本地 AI 知識庫

有時候,我難免不由地感慨,真實的人類世界,本就是一個巨大的娛樂圈,即使是在英雄輩出的 IT 行業。數日前,Google 正式對外發布了 Gemini 1.5 Pro,一個建立在 Transformer 和 MoE 架構上的多模態模型。可惜,這個被 Google 寄予厚望的產品并未激起多少水花,因為就在同一天…

動作生成學習筆記

目錄 ReMoDiffus 檢索和擴散 文字生運動 action生運動 ReMoDiffus 檢索和擴散 ICCV 2023 | 重塑人體動作生成,融合擴散模型與檢索策略的新范式ReMoDiffuse來了,根據文本生成動作 有例子和模型&

CSS 顯示隱藏動畫(動畫失效問題)

就像這個動畫一樣的效果&#xff0c;div 先是隱藏的&#xff0c;點擊按鈕后顯示并且有動畫效果&#xff0c;隱藏的時候同樣。 <button class"btn" id"btn">點擊</button><div class"box" id"box"></div><s…

一些常用到的git命令

git stash -a //緩存所有文件 git checkout -b dev origin/dev //切換到dev分支上,接著跟遠程的origin地址上的dev分支關聯起來 //推送本地分支到遠程倉庫 git push origin localbranchname:remotebrancname git revert onefile //https://www.freecodecamp.org/news/git-re…

S2---FPGA-A7板級原理圖硬件實戰

視頻鏈接 FPGA-A7板級系統硬件實戰01_嗶哩嗶哩_bilibili FPGA-A7板級原理圖硬件實戰 基于XC7A100TFGG484的FPGA硬件設計流程圖 A7核心板&#xff0c;是基于XILINX公司的ARTIX-7系列100T的XC7A100T,2FGG484I這款芯片開發的高性能核心板&#xff0c;具有高速&#xff0c;高帶寬&a…

HashMap在多線程下形成環的死鎖詳解

1. HashMap的工作原理 HashMap是Java中基于哈希表的Map接口的非同步實現。它存儲鍵值對&#xff0c;并允許使用null鍵和null值。HashMap通過使用鍵對象的hashCode()方法來決定鍵值對的存儲位置。 2. 多線程環境下的問題 在多線程環境下&#xff0c;如果多個線程同時對HashMap進…

Android 簽名機制

V1是內部文件單個簽 但是增加apk文件目錄下面隨意增加文件并不會有影響,它只關心meta-info文件 mf匯總清單的各個文件sha256 V2 整個APK文件,按文件進行hash 那么便不能隨便在這里面增加文件了,增加了簽名分塊&#xff08;不然簽名信息存哪里&#xff09;這里涉及一個文件概念 …

如何修煉成“神醫”——《OceanBase診斷系列》之一

本系列是基于OcenaBase 開發工程師在工作中的一些診斷經驗&#xff0c;也歡迎大家分享相關經驗。 1. 關于神醫的故事 扁鵲&#xff0c;中國古代第一個被正史記載的醫生&#xff0c;他的成才之路非常傳奇。年輕時&#xff0c;扁鵲是一家客棧的主管。有一位名叫長桑君的客人來到…

性能優化篇(二) 靜態合批步驟與所有注意事項\游戲運行時使用代碼啟動靜態合批

靜態合批步驟: 1.開啟Project Settings —>Player–>Other Setting里勾選Static Batching選項(一般情況下unity都是默認勾選狀態) 2.勾選需要合批的靜態物體上的Batching Static項,勾選后此物體下的所有子物體都默認參與靜態合批(勾選后物體不能進行移動/旋轉/縮放操作,…

02-設計概述

上一篇&#xff1a;01-導言 本章重點討論 JNI 中的主要設計問題。本節中的大多數設計問題都與本地方法有關。調用 API 的設計將在第 5 章&#xff1a;調用 API 中介紹。 2.1 JNI 接口函數和指針 本地代碼通過調用 JNI 函數來訪問 Java 虛擬機功能。JNI 函數可通過接口指針使用…

LeetCode383. 贖金信(C++)

LeetCode383. 贖金信 題目鏈接代碼 題目鏈接 https://leetcode.cn/problems/ransom-note/description/ 代碼 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int record[26] {0};if(ransomNote.size() > magazine.size()) return fa…

多層感知器(神經網絡)與激活函數

單個神經元&#xff08;二分類&#xff09; 多個神經元&#xff08;多分類&#xff09; 多層感知器 多層感知器&#xff0c;他是一種深度學習模型&#xff0c;通過多層神經元的連接和激活來解決非線性問題。 激活函數 激活函數的種類包括relu&#xff0c;sigmoid和tanh等 …

批量檢測微信小程序是否封禁接口源碼

<?php // 要檢測的 appid 列表 $appids array(appid1, appid2, appid3); // 使用實際的 appid // 循環調用接口檢測小程序狀態 foreach ($appids as $appid) { $url https://yan.changxunwangluo.cn/xcx/check_mini_program.php?appid . urlencode($appid); $…

敏捷開發模型:一種靈活、協作和持續的軟件開發方法

敏捷開發模型&#xff1a;一種靈活、協作和持續的軟件開發方法 引言 在軟件開發領域&#xff0c;隨著市場需求的不斷變化和技術的迅速發展&#xff0c;傳統的瀑布模型逐漸暴露出其局限性。為了應對這些挑戰&#xff0c;敏捷開發模型應運而生。敏捷開發模型強調靈活、協作和持…

【ArcPy】簡化ArcGISPro默認Python環境體量

參考文獻 安裝 ArcPy—ArcGIS Pro | 文檔

找工作筆記

記錄利用訊飛星火 問題1&#xff1a;作為一名無線通信工程師&#xff0c;找到適合自己的工作需要一系列的準備和策略。以下是一些建議&#xff0c;幫助你找到理想的職位&#xff1a; 1. **更新簡歷和在線資料**&#xff1a;---重要&#xff0c; - 確保你的簡歷是最新的&am…

[數據集][目標檢測]雞蛋破蛋數據集VOC+YOLO格式792張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;792 標注數量(xml文件個數)&#xff1a;792 標注數量(txt文件個數)&#xff1a;792 標注類別…

LVGL 的事件響應, 按鍵

在LVGL中&#xff0c;所有控件都能夠響應事件&#xff0c;但并非所有控件默認都會有預設的事件響應行為。LVGL的設計允許用戶為任何控件添加事件處理函數&#xff0c;以響應各種用戶交互&#xff0c;例如點擊、長按、拖動等。這意味著&#xff0c;雖然控件本身具備響應事件的能…