【IOS学习】消息转发和它的实际应用

本文介绍了Objective-C中的消息转发机制,并提供了具体的实现示例。通过该机制,可以将未实现的方法转发给其他对象处理,有效避免了对空对象操作引发的崩溃问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


消息转发,适用于把操作给另外一个类来实现

[objc]  view plain  copy
  1. -(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector  
  2. {  
  3.     NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];  
  4.     if (!signature) {  
  5.         signature = [self.displayLabel methodSignatureForSelector:aSelector];  
  6.     }  
  7.     return signature;  
  8. }  
  9.   
  10. -(void)forwardInvocation:(NSInvocation *)anInvocation  
  11. {  
  12.     SEL selector = [anInvocation selector];  
  13.     if ([self.displayLabel respondsToSelector:selector]) {  
  14.         [anInvocation invokeWithTarget:self.displayLabel];  
  15.     }  
  16. }  
上例中,一个UIViewController包含了UIlable 属性 displayLabel, 如果UIViewController 实例调用[instance setText:@"string"]方法,由于类没有实现setText:方法,通过上面两行代码,将会转发,由 displayLabel 实现。


另:消息转发的使用,下面的类别拓展解决了对NSNull对象操作导致的崩溃(在网络数据返回为空的时候经常遇到)

[objc]  view plain  copy
  1. - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector  
  2. {  
  3.     NSMethodSignature* signature = [super methodSignatureForSelector:selector];  
  4.     if (!signature) {  
  5.         for (NSObject *object in NSNullObjects) {  
  6.             signature = [object methodSignatureForSelector:selector];  
  7.             if (signature) {  
  8.                 break;  
  9.             }  
  10.         }  
  11.           
  12.     }  
  13.     return signature;  
  14. }  
  15.   
  16. - (void)forwardInvocation:(NSInvocation *)anInvocation  
  17. {  
  18.     SEL aSelector = [anInvocation selector];  
  19.       
  20.     for (NSObject *object in NSNullObjects) {  
  21.         if ([object respondsToSelector:aSelector]) {  
  22.             [anInvocation invokeWithTarget:object];  
  23.             return;  
  24.         }  
  25.     }  
  26.       
  27.     [self doesNotRecognizeSelector:aSelector];  
  28. }  


详细例子参照:https://github.com/caigee/iosdev_sample下的
ClassForward

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值