iOS之《Effective Objective-C 2.0》读书笔记(12)

来源:互联网 发布:电脑c盘数据恢复 编辑:程序博客网 时间:2024/06/05 05:05

第12条:理解消息转发机制

1.消息转发机制的作用

对象在接受到无法解读的消息时,会在编译时报警告,运行时直接崩溃,此方法可以给对象和消息更多的机会来完成成功的调用

2.消息转发流程

流程图

(1)动态方法解析:

+(BOOL)resolveInstanceMethod:(SEL)sel // 实例方法+(BOOL)resolveClassMethod:(SEL)sel    // 类方法
  • 下列代码演示了如何用“resolveInstanceMethod:”来实现@dynamic属性:
id autoDictionaryGetter(id self, SEL _cmd);  void autoDictionarySetter(id self, SEL _cmd, id value);  + (BOOL)resolveInstanceMethod:(SEL)selector {      NSString *selectorString = NSStringFromSelector(selector);      if ( /* selector is from a @dynamic property */ ) {          if ([selectorString hasPrefix:@"set"]) {              class_addMethod(self,                              selector,                              (IMP)autoDictionarySetter,                              "v@:@");          } else {              class_addMethod(self,                              selector,                              (IMP)autoDictionaryGetter,                              "@@:");          }          return YES;      }  return [super resolveInstanceMethod:selector];  } 

(2)备援接受者:运行期系统把消息转给其他接收者处理

- (id)forwardingTargetForSelector:(SEL)aSelector{    class *other = [class new];    if ([other forwardingTargetForSelector:aSelector]) {        return other;    }else{        return [super forwardingTargetForSelector:aSelector];    }}

(3)完整的消息转发:创建NSInvocation对象,把与尚未处理的那条消息有关的全部细节都封于其中。此对象包含选择子、目标target及参数。在触发NSInvocation对象时,消息派发系统会把消息指派给目标对象

  • TestModel
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {      if(aSelector == @selector(testMethod))      {          return [NSMethodSignature signatureWithObjCTypes:"v@:"];      }      return nil;  }  -(void)forwardInvocation:(NSInvocation *)anInvocation  {      if (anInvocation.selector == @selector(testMethod))      {          TestModelHelper1 *h1 = [[TestModelHelper1 alloc] init];          TestModelHelper2 *h2 = [[TestModelHelper2 alloc] init];          [anInvocation invokeWithTarget:h1];          [anInvocation invokeWithTarget:h2];      }  }  
  • TestModelHelper1
-(void)testMethod  {      NSLog(@"i am TestModelHelper1");  }  
  • TestModelHelper2
-(void)testMethod  {      NSLog(@"i am TestModelHelper2");  }  
  • 主调用类 : TestModel本身没有实现testMethod方法,但最终运行后,程序没有报错,且TestModelHelper1和TestModelHelper2的testMethod方法都被执行了
TestModel *model = [[TestModel alloc] init];  [model testMethod];  

(4)消息未能处理:调用doesNotRecognizeSelector抛出异常

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑开机密码到期忘记改怎么办 电脑账户数据库密码忘了怎么办 微信不能拍摄了怎么办 华硕笔记本用户名密码忘了怎么办 学信网登录密码用户名搞忘怎么办 电脑密码输入错误会被锁怎么办 电脑被锁机软件设了密码怎么办 电脑密码被锁了怎么办 电脑xp密码忘了怎么办 三星账户账号密码忘了怎么办 三星账户密码忘记了怎么办 w7账号被禁用了怎么办 笔记本用户名密码忘记了怎么办 笔记本忘记用户名和密码怎么办 苹果手机忘记用户名和密码怎么办 w10电脑忘了密码怎么办 联想台式电脑密码忘记了怎么办 新电脑用一会就很烫怎么办 电脑忘了密码怎么办啊 戴尔笔记本账户密码忘记了怎么办 华硕台式电脑开不了机怎么办 手机号申请qq账号上限了怎么办 店铺不干了被告商标侵权怎么办 咸鱼违规被投诉侵犯商标权怎么办 房子买了70年后怎么办 买房付完首付后怎么办 手机b站忘记密码怎么办 护士电子注册没有激活码怎么办 大王卡变3g网是怎么办 无法解析服务器的dns地址怎么办 笔记本dns辅服务器未响应怎么办 原营业执照注销法人没在怎么办? 加盟骗局公安局工商局不管怎么办 发现老婆衣柜里有避孕套怎么办 2岁宝宝爱舔东西怎么办 痔疮手术后痛疼怎么办 长了内痔疮该怎么办 淘宝卖家遇到恶意买家怎么办 淘宝遇到恶意买家拍单怎么办 淘宝遇到买家恶意搞坏商品怎么办 木油味道很重怎么办