A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tutucoo 中级黑马   /  2015-6-11 14:05  /  938 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


[objc] view plaincopyprint?


  • -(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];  
  •     }  
  • }  

上例中,一个UIViewController包含了UIlable 属性 displayLabel, 如果UIViewController 实例调用[instance setText:@"string"]方法,由于类没有实现setText:方法,通过上面两行代码,将会转发,由 displayLabel 实现。

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

[objc] view plaincopyprint?


  • - (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];  
  • }  


2 个回复

倒序浏览
新手  看不懂     
回复 使用道具 举报
太难了     
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马