作家
登录

iOS消息转发机制Demo解析

作者: 来源: 2017-12-18 12:04:07 阅读 我要评论

【编辑推荐】

  1. Android源码下载:QQ第三方登录demo
  2. Android源码:浏览器应用 adnroid webview demo
  3. Android源码下载:屏幕画笔Demo
  4. 一个Demo展示Storyboard的强大年夜
  5. 小Demo大年夜常识-经由过程控制Button仪羁啻进修Android坐标
【义务编辑:未丽燕 TEL:(010)68476606】

开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散


假设说我们声明一个类, 初始化对象, 并且在词攀类声明一个办法, 调用办法的时刻底层是怎么处理的呢? 今天我们来简单模仿测试, 来看事理产生了什么

以下是调用办法处理的筹划图, 按照筹划次序去处理

以下是体系办法

  1. //消息转发 
  2. //- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 
  3. //标准的消息转发 
  4. //- (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); 
  5. //- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); 
  6. // 
  7. //动态办法解析 
  8. //+ (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 
  9. //+ (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); 

Demo解析

创建类, Person类, 声明办法, 并且在ViewController进行初始化调用

  1. VC中 
  2. Person *person = [Person new]; 
  3. [person run]; 
  4. Person类中 
  5. - (void)run;//没有实现 

此时运行是不是会报错呢? 就是这个常见的缺点

“ - [Person run]: unrecognized selector sent to instance 0x600000008310’ “

那么如许做到底产生了什么? 做了哪些工作? 我们一步步来分析

动态测试

在Presenter类中, 写动态办法

  1. + (BOOL)resolveInstanceMethod:(SEL)sel{ 
  2. NSLog(@"sel = %@",NSStringFromSelector(sel)); 
  3. return [super resolveInstanceMethod:sel]; 

再次运行Demo就会走到这个办法中, 也就是我们所指的筹划1, 此时打印出来的scl为” 消息转发机制Demo[41829:4186268] sel = run “

  1. + (BOOL)resolveInstanceMethod:(SEL)sel{ 
  2. NSLog(@"sel = %@",NSStringFromSelector(sel)); 
  3. //1.断定没有实现办法, 那么我们就是动态添加一个办法 
  4. if (sel == @selector(run:)) { 
  5. class_addMethod(self, sel, (IMP)newRun, "v@:@:"); 
  6. return YES; 
  7. return [super resolveInstanceMethod:sel]; 
  1. void newRun(id self,SEL sel,NSString *str) { 
  2. NSLog(@"---runok---%@",str); 

温馨小提示, 动态添加办法参数意译 : //将要添加办法的类/sel名/IMP函数指针<添加函数>, 官方文档其实是有解释的

此时我们再次运行, 那么打印结不雅就来了” 消息转发机制Demo[43269:4212899] —runok—ok跑 “, 如许的话我们就解决掉落了报错这个问题

消息转发重定向测试

此时我们新创建一个类Mbxb, 此时我们照样从新写一个同名字的办法run办法, 并且进行实现

  1. - (void)run{ 
  2. NSLog(@"---Mbxbrunok---"); 

  3.   推荐阅读

      灾难恢复计划如何使企业免受业务中断?

    开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 您企业的营业经由过程异步备份便可以或许获得支撑,抑>>>详细阅读


    本文标题:iOS消息转发机制Demo解析

    地址:http://www.17bianji.com/lsqh/39877.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)