美文网首页iOS成长之路
runtime 消息转发、方法交换

runtime 消息转发、方法交换

作者: coco_CC | 来源:发表于2019-08-19 18:12 被阅读0次

    今天整理了iOS中相比较难一点的知识,但是作为一个iOS开发者,必须要掌握的技术点。下面我来描述下runtime机制

    一、消息转发机制

      1、当消息发送一个对象时,他的依次执行顺序
    
      2、从运行时系统缓存使用过的方法中寻找
    
      3、objc_msgSend通过对象的isa指针获取到类的结构体,然后在方法分发表里面查找方法的selector。
    
      4、objc_msgSend结构体中的指向父类的指针找到其父类,并在父类的分发表里面查找方法的selector
    
      5、依此,会一直沿着类的继承体系到达NSObject类
    
      6、如果最后没有定位到selector,则会走消息转发流程
    
    1)、动态方法解析

    对象在接收到未知的消息时,首先会调用所属类的类方法

    +resolveInstanceMethod:(实例方法)或者

    +resolveClassMethod:(类方法)。

    返回的是一个bool值:

    YES 消息已处理

    NO 消息未处理,进入备用接收者

    2)、备用接收者

    - (id)forwardingTargetForSelector:(SEL)aSelector

    返回值是否为nil

    nil为没有备用接收者,只能走完整消息转发了

    非nil 作为消息的新接收者(不能是self本身,会出现死循环)

    3)、完整消息转发

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

    - (void)forwardInvocation:(NSInvocation *)anInvocation

    返回nil为不处理,只能崩溃了

    非nil,若有方法签名,会转发到其他对象处理

    二、方法交换

    正常情况下,一个方法名对应一个IMP指针

    如图所示:

    image.png

    方法交换后

    方法名对应的IMP指针和其他的方法名对应的IMP指针做了交换

    如图:

    image.png

    感谢博主详细讲解:----------

    相关文章

      网友评论

        本文标题:runtime 消息转发、方法交换

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