什么时候会报unrecognized selector的异常?
2024-08-23 20:36:01
- 当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决,如果还是不行就会报unrecognized selector异常
objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:
- objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类
- 然后在该类中的方法列表以及其父类方法列表中寻找方法运行
- 如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。但是在这之前,objc的运行时会给出
三次
拯救程序崩溃的机会
三次
拯救程序崩溃的机会- Method resolution
- objc运行时会调用
+resolveInstanceMethod:或者 +resolveClassMethod:
,让你有机会提供一个函数实现。 - 如果你添加了函数并返回
YES
,那运行时系统就会重新启动
一次消息发送的过程 - 如果 resolve 方法返回 NO ,运行时就会移到下一步,消息转发
- objc运行时会调用
- Fast forwarding
- 如果目标对象实现了
-forwardingTargetForSelector:
,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会 - 只要这个方法返回的
不是nil和self
,整个消息发送的过程就会被重启
,当然发送的对象会变成你返回的那个对象。 - 否则,就会继续Normal Fowarding。
- 这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但Normal forwarding转发会创建一个NSInvocation对象,相对Normal forwarding转发更快点,所以这里叫Fast forwarding
- 如果目标对象实现了
- Normal forwarding
- 这一步是Runtime最后一次给你挽救的机会。
- 首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。
- 如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。
- 如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象
- Method resolution
最新文章
- SQL中Group By的使用
- Emag eht htiw Em Pleh(imitate)
- Cash Machine_多重背包
- Entity Framework学习笔记(一)
- codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
- 几个排序算法的JS实现
- windows service 安装和卸载指令
- boost xpressive 例子
- SELECT TOP 1 * FROM是什么意思
- node.js框架express的安装
- CSS以图换字的9种方法
- flask中的session,render_template()第二和参数是字典
- Jfinal控制器源码解读
- 关于webService发布的wsdl中的import问题解决
- 理解WebKit和Chromium: Chromium网络栈
- 王者荣耀交流协会final发布-第3次scrum立会
- 关于前端滚动条,input框等样式的修改
- Django 数据库迁移
- hql和sql练习题
- [COGS2554][SYZOJ247][福利]可持久化线段树