一、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