Objective-C是动态语言,方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector)。
objc向对象发送消息时,runtime会根据isa指针找到对象所属类,从该类及父类方法列表寻找方法运行 如果没有找到便会抛出异常 unrecognized selector sent to xxx, 但是在这之前有三次拯救机会。

1.Method resolution 方法解析处理阶段

如果调用了方法 首先会调用+(BOOL)resolveInstanceMethod:(SEL)sel【对象方法】, +(BOOL)resolveClassMethod:(SEL)sel【类方法】进行判断,如果YES能接收消息,NO就会进行第二步。

+(BOOL)resolveInstanceMethod:(SEL)sel;
+(BOOL)resolveClassMethod:(SEL)sel;

为未实现的方法动态添加实现,method1未实现,为类添加方法实现,将method2的IMP实现添加到method1。

+(BOOL)resolveInstanceMethod:(SEL)sel{IMP imp = class_getMethodImplementation(self.class, @selector(method2));class_addMethod(self.class, @selector(method1), imp, "v@:");return [super resolveInstanceMethod:sel];
}-(void)method2{NSLog(@"哈哈哈%s",__func__);
}

2.Fast forwarding 快速转发阶段

如果第一步返回NO,则进入消息转发第二步。

-(id)forwardingTargetForSelector:(SEL)aSelector;

此方法可以将本类不能处理的方法转发给其他对象进行处理

-(id)forwardingTargetForSelector:(SEL)aSelector {NSLog(@"%s-%@",__func__,NSStringFromSelector(aSelector));if (aSelector == @selector(method1)) {return [LGTeacher alloc];}return [super forwardingTargetForSelector:aSelector];
}

3.Normal forwarding 常规转发阶段

如果第二返回self或nil,则进入第三步。

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
-(void)forwardInvocation:(NSInvocation *)anInvocation;
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {NSLog(@"%s-%@",__func__,NSStringFromSelector(aSelector));return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}-(void)forwardInvocation:(NSInvocation *)anInvocation {LGTeacher *t = [LGTeacher alloc];if ([self respondsToSelector:anInvocation.selector]) {[anInvocation invokeWithTarget:self];}else if ([t respondsToSelector:anInvocation.selector] ) {[anInvocation invokeWithTarget:t];}else {NSLog(@"%s-%@",__func__,NSStringFromSelector(anInvocation.selector));}
}

iOS 消息转发(Message Forwarding)相关推荐

  1. iOS 消息转发机制

    这篇博客的前置知识点是 OC 的消息传递机制,如果你对此还不了解,请先学习之,再来看这篇.这篇博客我尝试用口语的方式像讲述 PPT 一样给大家讲述这个知识点. 我们来思考一个问题,如果对象在收到无法解 ...

  2. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)

    本文旨在总结iOS知识网络,知识点,该知识网络罗列出常见UIKit.Foundation的对象特点和一些使用经验,可以看成是一本书:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望 ...

  3. iOS之深入解析消息转发objc_msgSend的应用场景

    一.消息转发 现有如下示例: id o = [NSObject new]; [o lastObject]; 执行上面代码,程序会崩溃并抛出以下异常: [NSObject lastObject]: un ...

  4. iOS 底层探索 - 消息转发

    一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...

  5. 【iOS底层】11:消息转发

    一.msgSend消息发送监听 在探索了很多次了lookUpImpOrForward方法中,查找完成后会写入cache 在写入cache中发现有个打印log的操作 我们来看下是否可以通过这个输出到本地 ...

  6. 【iOS沉思录】Objective-C语言消息传递机制三道防线:消息转发机制详解

    消息传递机制: 在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用'动态绑定'机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码.方法的调用实际 ...

  7. iOS的消息机制和消息转发

    1.消息机制 RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接 ...

  8. Runtime底层原理总结--反汇编分析消息转发

    消息转发:发送一个消息,也就是sel查找imp,当没有找到imp,接下来进入动态方法解析,如果开发者并没有处理,会进入消息转发. 消息转发 前几篇文章介绍了Runtime底层原理和动态方法解析总结 , ...

  9. runtime消息转发机制

    Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制.而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库.它是 Objective- ...

最新文章

  1. 国产WEB漏洞测试平台——MST
  2. 如何处理VirtualBox启动错误消息:The vboxdrv kernel module is not loaded
  3. IE下列表框不能给option绑定click事件的解决办法
  4. amr转换成mp3 java_java将amr文件转换为MP3格式(windowslinux均可使用,亲测)
  5. erc20怎么查询代币交易记录_信用卡在pos机上刷卡手续费怎么算?信用卡刷卡记录如何查询?...
  6. python绘制不带颜色曲线图_绘制一条曲线,并根据每个点的值和定制的颜色图对其进行着色...
  7. MyBatis学习总结_03_优化MyBatis配置文件中的配置
  8. Oracle 11g简体中文版的安装过程及图解
  9. 环世界服务器显示不出来,环世界控制台代码 | 手游网游页游攻略大全
  10. 【一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成】
  11. fileupload 使用
  12. 《新时代的中国青年》白皮书——一个90后的自白
  13. tp5框架中调用支付宝线上资金预授权alipay.fund.auth.order.app.freeze接口
  14. nodejs-指定长度断句
  15. Win10启动或关闭windows功能,一直显示“请稍后”该怎么办?(win10请稍后)
  16. 俄语入门难不难-大舌音难学吗-弹舌难学吗
  17. 设计模式六大原则之里氏替换原则、依赖倒置原则详解
  18. Harbor docker login x509 certificate signed by unknown authority
  19. STM32硬件IIC读写EEPROM
  20. 免费离线PDF工具箱,PDF工具大全,PDF合并PDF加密PDF解密PDF格式转换PDF分割PDF旋转以及从PDF中提取图片,满足对PDF操作的一切需求~完全免费无使用次数限制,文末附下载链接~

热门文章

  1. CPU, GPU, FPGA计算能力
  2. openCV 自学笔记
  3. linux怎么设置wifi密码,技术|怎样在 Arch Linux 终端上更改 WiFi 密码
  4. 在线订票系统--永胜票务网是怎么搭建的?
  5. 帝国CMS 批量修改信息标题方法
  6. 11 从零实现线性回归
  7. hdu5238 calculator (线段树+crt)
  8. 贝萨尔曲线实现Periscope心形点赞动画效果
  9. 山东菏泽家乡网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  10. 怎样做一个iOS App的启动分层引导动画?