【IOS學習】訊息轉發和它的實際應用
阿新 • • 發佈:2019-01-26
訊息轉發,適用於把操作給另外一個類來實現
上例中,一個UIViewController包含了UIlable 屬性 displayLabel, 如果UIViewController 例項呼叫[instance setText:@"string"]方法,由於類沒有實現setText:方法,通過上面兩行程式碼,將會轉發,由 displayLabel 實現。-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { NSMethodSignature *signature = [super methodSignatureForSelector:aSelector]; if (!signature) { signature = [self.displayLabel methodSignatureForSelector:aSelector]; } return signature; } -(void)forwardInvocation:(NSInvocation *)anInvocation { SEL selector = [anInvocation selector]; if ([self.displayLabel respondsToSelector:selector]) { [anInvocation invokeWithTarget:self.displayLabel]; } }
另:訊息轉發的使用,下面的類別拓展解決了對NSNull物件操作導致的崩潰(在網路資料返回為空的時候經常遇到)
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { NSMethodSignature* signature = [super methodSignatureForSelector:selector]; if (!signature) { for (NSObject *object in NSNullObjects) { signature = [object methodSignatureForSelector:selector]; if (signature) { break; } } } return signature; } - (void)forwardInvocation:(NSInvocation *)anInvocation { SEL aSelector = [anInvocation selector]; for (NSObject *object in NSNullObjects) { if ([object respondsToSelector:aSelector]) { [anInvocation invokeWithTarget:object]; return; } } [self doesNotRecognizeSelector:aSelector]; }