美文网首页
iOS消息转发机制

iOS消息转发机制

作者: PageWen | 来源:发表于2019-02-25 18:02 被阅读0次

使用oc开发的开发者们,或多或少的接触过类似的崩溃unrecognized selector sent to instance 0x60000001b200',出现这种问题的原因很好理解,就是未实现对象的方法。但是在实际开发中要如何取避免这种崩溃的产生呢?这就需要用到今天的主题--消息转发
通过崩溃日志的栈信息

    0   CoreFoundation                      0x00000001065b91e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x00000001033d2031 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010663a784 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x000000010653b898 ___forwarding___ + 1432
    4   CoreFoundation                      0x000000010653b278 _CF_forwarding_prep_0 + 120
    5   PQMsgForwardDemo                    0x0000000102ace689 -[ViewController viewDidLoad] + 121 

我们可以看出在抛出异常前,编译器有去调用一些方法,如forwarding_prep_0,-[NSObject(NSObject) doesNotRecognizeSelector:]等方法,所以我们利用aop的思路,在这些方法中做处理,从而避免崩溃的产生。

iOS方法调用在runtime中调用过程

oc调用方法一般为[obj foo],这样便表示对象调用了一个方法,但是这么一个简单的语句在runtime中却有着丰富的操作。
1.[obj foo]会转换成obj_msgSend(id receiver,cmd sel,arg1,arg2,... ),其中receiver为发起对象obj,sel是指方法,之后的参数对应方法带的参数;

  1. 查找receiver对象的缓存方法,如果有缓存方法的话,则返回selector,没有缓存的话则去该类中搜索方法;
    2.1 首先,在本类的方法列表中查询;
    2.2 本类中没有查询到方法,则向上查询父类方法列表,以此向上,直到找到方法;
    2.3 把找到的方法缓存,并返回;
  2. 如果在本类及所有父类method_list中都没找到方法,则会调用resolveInstanceMethod,在这个方法中可以动态添加方法,但是不会做缓存;
  3. resolveInstanceMethod方法中没有动态添加方法,仍然有机会拦截异常抛出,就是在forwardingTargetForSelector方法中将方法转移到其他类去实现;
  4. 如果forwardingTargetForSelector中没有转发消息的话,系统会默认执行forwardInvocation方法,在执行forwardInvocation方法前要通过,methodSignatureForSelector方法获取方法签名,然后把方法签名,其中ObjCTypes类型有v(void)、@(对象)、:(方法)、l(长整型)、d(double类型)、i(int类型)等,详细的可以查看官方说明;
  5. 如果上面的转发方法都没有成功处理异常,系统则会调用doesNotRecognizeSelector方法

消息转发流程图

流程图.png

相关文章

  • runtime系列文章总结

    《iOS Runtime详解(消息机制,类元对象,缓存机制,消息转发)》《消息转发机制与Aspects源码解析》《...

  • iOS理解Objective-C中消息转发机制附Demo

    iOS理解Objective-C中消息转发机制附Demo iOS理解Objective-C中消息转发机制附Demo

  • iOS面试-基础

    [toc] Runloop AutoReleasePool 多线程 响应者链 消息响应机制 消息转发机制 iOS内...

  • iOS 消息转发机制

    今天大概学习了下iOS的消息转发机制,还是挺有收获,在此做下笔记,以便后面温习。 1.iOS的消息转发机制原理如下...

  • iOS面试题总结(二)

    iOS面试题(二) 消息发送和转发机制,SEL和IMP 消息发送转载自黄龙辉消息发送和消息转发机制 在Object...

  • Runtime

    相关简单介绍 消息机制消息传递机制消息转发机制-动态添加方法消息转发机制-快速转发消息转发机制-慢速转发消息转发机...

  • iOS - 消息转发机制

    我们知道,OC是动态语言,所有的方法都会以消息的形式传递给对象,对象会根据方法的类型来进行实例方法或者类方法的选择...

  • 【iOS】消息转发机制

    1、动态方法解析 对象在收到无法处理的消息时,会调用下面的方法,前者是调用类方法时会调用,后者是调用对象方法时会调...

  • iOS消息转发机制

    OC消息转发 oc中的调用对象或者类不存在的方法,会执行一遍消息转发流程.消息转发主要包括4步 首先调用+ (BO...

  • iOS 消息转发机制

    iOS开发过程中我们经常会碰到这样的报错:unrecognized selector sent to instan...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/tgewyqtx.html