詳解iOS消息轉發機制

一、iOS消息轉發機制原理

iOS的消息轉發是指在某個對象接收到一個消息(調用一個方法)時,如果該對象無法響應這個消息,那麼就會進入消息轉發機制,嘗試將消息轉發給其他對象進行響應。

具體的消息轉發機制分為三個步驟:

1、動態方法解析:當接收到無法響應的消息時,首先會走動態方法解析,如果該對象的類有實現 +resolveInstanceMethod: 方法的話,那麼就嘗試通過這個方法為當前類動態添加能夠響應該消息的方法。

示例代碼:

“`
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(demoMethod)) {
class_addMethod([self class], sel, (IMP) demoMethodIMP, “@:”);
return YES;
}
return [super resolveInstanceMethod:sel];
}

void demoMethodIMP(id self, SEL _cmd) {
NSLog(@”動態添加方法demoMethod”);
}
“`

2、備用接收者:如果動態方法解析失敗,那麼就會嘗試將消息轉發給另外一個對象進行響應,這個對象就是備用接收者,通常是該對象的某個屬性。

示例代碼:

“`
– (id)forwardingTargetForSelector:(SEL)aSelector {
if ([NSStringFromSelector(aSelector) isEqualToString:@”demoMethod”]) {
return [AnotherObject new];
}
return [super forwardingTargetForSelector:aSelector];
}
“`

3、完整的消息重定向:當備用接收者也無法響應該消息時,程序就會走完整的消息重定向機制,這個機制最終會將無法響應的消息發送給一個默認的接收對象進行處理,也就是 NSObject 類中的 `doesNotRecognizeSelector` 方法。

示例代碼:

“`
– (void)forwardInvocation:(NSInvocation *)anInvocation {
NSLog(@”消息轉發”);
[super forwardInvocation:anInvocation];
}

– (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
if(selector == @selector(demoMethod)) {
return [NSMethodSignature signatureWithObjCTypes:”v@:”];
}
return [super methodSignatureForSelector:selector];
}
“`

二、iOS消息轉發解決崩潰

在使用 iOS 的消息轉發機制時,可能會出現一些難以調試和捕捉的崩潰,這是由於在 Objc 的 runtime 時間動態載入方法,進行調用方法指針時,如果指針為 NULL 時,系統就會拋出一個錯誤信號 SIGSEGV。

對於這種崩潰,我們需要在消息轉發機制中進行容錯處理,避免因為一個方法不存在而導致整個程序崩潰。

示例代碼:

“`
– (void)forwardInvocation:(NSInvocation *)anInvocation {
if([self respondsToSelector:anInvocation.selector]) {
[anInvocation invokeWithTarget:self];
}else {
[super forwardInvocation:anInvocation];
}
}

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature * methodSignature = [super methodSignatureForSelector:aSelector];
if (!methodSignature) {
methodSignature = [self.myFallbackObject methodSignatureForSelector:aSelector];
}
return methodSignature;
}
“`

三、iOS消息轉發機制面試

在 iOS 面試過程中,消息轉發機制是一個常見的面試題目。由於消息轉發機制的複雜性,面試官通常會從以下幾個方面來評測候選人的能力:

1、對 iOS 消息轉發機制原理的理解程度,以及能否準確地進行操作;

2、候選人在解決某個 bug 時是否能夠合理地運用消息轉發機制;

3、題目細節問題的解決能力,比如在什麼情況下,備用接收對象和完整消息重定向的順序會發生變化等。

四、iOS 開發 runtime 消息轉發機制

iOS 開發中,能夠靈活地處理消息轉發機制是非常重要的。而基於 Objc 的 runtime,我們可以在運行時動態地接收和處理一些原本無法處理的消息。

示例代碼:

“`
– (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL selector = [anInvocation selector];
if ([self.delegate respondsToSelector:selector]) {
[anInvocation invokeWithTarget:self.delegate];
}
}

– (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
NSMethodSignature * signature = [super methodSignatureForSelector:selector];
if (!signature) {
if ([self.delegate respondsToSelector:selector]) {
return [(id)self.delegate methodSignatureForSelector:selector];
}
}
return signature;
}
“`

五、iOS消息發送機制

iOS的消息發送機制是指在程序中調用一個方法時,編譯器將這個方法名編碼為一個唯一的 SEL 對象,同時為其生成一段彙編代碼。在執行這段代碼時,會將這個 SEL 發送給接收者對象進行響應。

示例代碼:

“`
[self performSelector:@selector(demoMethod)];
“`

六、iOS的消息推送機制

iOS的消息推送是指當應用程序在後台運行時,即使應用程序已經關閉,仍然能夠接收到新的消息推送通知。這個功能需要藉助後台通知技術來實現。當伺服器有新的消息推送時,可以通過 APNs(蘋果消息推送服務)來推送給用戶設備。

示例代碼:

“`
– (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@”” withString:@””] stringByReplacingOccurrencesOfString:@” ” withString:@””];
}
“`

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/200223.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-05 14:04
下一篇 2024-12-05 14:04

相關推薦

  • RabbitMQ和Yii2的消息隊列應用

    本文將探討RabbitMQ和Yii2之間的消息隊列應用。從概念、安裝和配置、使用實例等多個方面詳細講解,幫助讀者了解和掌握RabbitMQ和Yii2的消息隊列應用。 一、Rabbi…

    編程 2025-04-29
  • ROS線程發布消息異常解決方法

    針對ROS線程發布消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • 使用Python發送微信消息給別人

    問題:如何使用Python發送微信消息給別人? 一、配置微信開發者平台 首先,要想發送微信消息,需要在微信開發者平台中進行配置,來獲取對應的授權信息。具體步驟如下: 1、登錄微信公…

    編程 2025-04-28
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,著重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • iOS開發如何添加許可權

    在iOS開發中,為了保護用戶的隱私和安全,應用程序可能需要請求一些許可權。 一、請求應用程序許可權 應用程序不得在用戶未給予許可的情況下獲取用戶數據。許多iOS系統功能都需要獲得用戶的…

    編程 2025-04-27
  • 通過驗證後如何看驗證消息

    驗證消息通常告訴用戶某些操作是否成功或失敗,它對於用戶體驗和操作流程都非常重要。當用戶通過一項操作之後,獲取到相應的驗證消息能夠幫助用戶更好的了解操作結果,從而採取相應的行動和決策…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟體設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25

發表回復

登錄後才能評論