消息转发-什么时候会报unrecognized selector的异常?
来源:互联网 发布:跨境电商进口数据分析 编辑:程序博客网 时间:2024/05/23 23:27
简单来说:
当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决。
简单的流程如下,在上一题中也提到过:
objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector)。
objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会:
Method resolution
objc运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:,让你有机会提供一个函数实现。如果你添加了函数,那运行时系统就会重新启动一次消息发送的过程,否则 ,运行时就会移到下一步,消息转发(Message Forwarding)。
Fast forwarding
如果目标对象实现了-forwardingTargetForSelector:,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会。 只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。否则,就会继续Normal Fowarding。 这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但下一步转发会创建一个NSInvocation对象,所以相对更快点。
Normal forwarding
这一步是Runtime最后一次给你挽救的机会。首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象。
为了能更清晰地理解这些方法的作用,git仓库里也给出了一个Demo,名称叫“ _objc_msgForward_demo ”,可运行起来看看。
- 消息转发-什么时候会报unrecognized selector的异常?
- iOS开发笔记>> 什么时候会报 Unrecognized selector 的异常?
- 什么时候会报unrecognized selector错误?
- 怎么挽救unrecognized selector异常——消息转发机制
- 有关unrecognized selector sent to instance xxxxxxxxx的异常崩溃
- unrecognized selector的错误问题
- "unrecognized selector sent to instance *****"的错误
- 异样的unrecognized selector sent to instance
- 【ios 异常FAQ】unrecognized selector sent to instance
- iOS调用分类时异常unrecognized selector sent to class
- 理解"unrecognized selector sent to instance 0x1412c "异常
- unrecognized selector sent to
- OC的消息转发
- unrecognized selector sent to instance 问题快速定位的方法
- unrecognized selector sent to instance出现的原因和解决方案
- 发生错误unrecognized selector sent to instance的原因
- UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
- __NSCFString containsString:]: unrecognized selector sent to instance 的解决方案
- 如何使一个ul居中在网页上,不设置宽
- C#中Console.WriteLine()的用法
- zeppelin研究群和公众号
- PHP正则表达式手册
- Hadoop绑定多网卡问题
- 消息转发-什么时候会报unrecognized selector的异常?
- C C++ 文件输入与输出
- MySQL数据备份之mysqldump使用
- nginx源码学习 非http服务器的负载均衡实现
- Python基本数据结构:列表
- [shell] - type command
- 分享一个HTML5的video用法
- JAVA线程概念
- makeinfo 安装