三次拯救

Type Encodings

demo

三次拯救的使用示例

三次拯救的使用时机

在编译期间向类发送了其无法解读的消息并不会报错,因为在运行期可以继续向类中添加方法,所以编译期在编译时还无法通知类中到底会不会有某个方法实现。
objc_msgSend函数

objc_msgSend(void /* id self, SEL op, ... */ )

这个原语函数参数可变,第一个参数填入消息的接收者,第二个参数就是消息"选择子",后面跟着可选的消息的参数。有了这些参数,objc_msgSend就可以通过接收者的isa指针,到其类对象的方法列表中以选择子的名称为"键"寻找对应的方法。若找到对应的方法,则转到其实现代码执行,否则继续从父类中寻找,如果到根类还是无法找到对应的方法,说明该接收者对象没有响应该消息,那么就会触发消息转发机制,给开发者最后一次挽救程序crash的机会。

三次拯救流程

三次拯救
消息转发分为俩大阶段。

  1. 第一阶段先找到接收者,所属的类,看其是否能动态添加方法,以处理当前这个未知的选择子,这个过程叫动态方法解析。
  2. 第二阶段是完整的消息转发机制。如果运行期系统已经把第一阶段执行完了,那么接收者自己就无法再以动态新增方法的手段来响应该选择子的消息。此时运行期系统会请求接收者以其他手段来处理与消息相关的方法调用。这里又分为俩小步。
    • 首先请接收者看看其他对象能不能处理这条消息。若有,则runtime讲消息转发给那个对象,于是消息转发过程结束。
    • 若没有备用的接收者,则启动完整的消息转发机制,runtime会把与消息有关的全部细节封装到NSInvocation对象中,再给接收者最后的机会,令其设法解决当前未处理的消息。

以上的三种方法,被称为消息的三次拯救。

第一次拯救——动态方法解析

+ (BOOL)resolveInstanceMethod:(SEL)sel    //实例方法
+ (BOOL)resolveClassMethod:(SEL)sel  //类方法

该方法的参数就是那个未知的选择子,其返回值为Boolean类型,表示这个类能否新增一个实例方法用以处理此选择子。,在继续往下执行转发机制之前,本类有机会新增一个处理此选择子的方法。如果你添加了函数并返回YES, 那运行时系统就会重新启动一次消息发送的过程。

第二次拯救——备用接收者

- (id)forwardingTargetForSelector:(SEL)selector

当前接收者还有第二次机会能处理未知的选择子,在这一步中,运行期系统会问它:能不能把这条消息转给其他接收者来处理。

只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。

第三次拯救——完整的消息转发

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation

这是Runtime给我们最后一次的拯救机会,这一步会创建一个NSInvocation对象,所以比上面的慢点,故上面转发方法叫Fast fowarding
首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型,会有两种情况:

有返回值:如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送- forwardInvocation:消息给目标对象
无返回值:Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、 3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值