美文网首页
iOS 的RunTime的相关知识(自己的一些总结概括)

iOS 的RunTime的相关知识(自己的一些总结概括)

作者: hui8685291 | 来源:发表于2020-12-09 15:53 被阅读0次

    IMP

    Imp指针指向方法的实现;

    消息机制的过程

    消息发送的底层是汇编写的,其他主要是C、C++;
    首先判断消息接收者是否为nil,否则通过isa指针找到这个类,
    Isa 指针不是纯粹的isa指针,现在armv64是优化后的isa指针添加了掩码,进行与 操作 得到class,找到class之后,就去cache里面找对应的方法,找到了就调用或者返回imp,没找到就调用 objec_msgSend_uncached;
    类的缓存没有找到,就去类的方法列表里面去找方法实现imp,
    从汇编跳到c方法的_class_lookupMethodAndLoadCache3 再进入lookupImpOrForward方法,又会尝试去cache里面找Imp,如果找到了就返回Imp,(OC是动态语言,在执行过程中有可能再次动态添加方法实现,所以又进行了此次cache中寻找imp),如果还是没找到,这个时候才是真正的去类的方法列表里面去找,找到了就把method填充到cache里面然后返回Imp,如果在其类中还是没找到,就通过父类的superclass指针去父类的缓存中寻找imp,且此imp不是消息转发的缓存imp,则填充到该class(非父类)的缓存中,如果还没找到,就去父类的方法列表里面进行寻找,找到了就填充到该类的方法cache中,然后再返回imp,如果父类还是没找到,则依此次序进入父类的父类进行寻找,直到根类为止,如果最终还是没找到,则进行一次动态方法解析resolver,

    + (BOOL)resolveInstanceMethod:(SEL)sel
    + (BOOL)resolveClassMethod:(SEL)sel
    
    

    若还是没找到则进行消息转发;

    进入消息重定向

    - (id)forwardingTargetForSelector:(SEL)aSelector, 如果有指定消息接收对象则将消息转由接收对象响应 否则继续;系统调用上一个方法后未能实现添加新方法,这是系统提供一个将SEL转给其他对象的机会。
    

    开始消息转发 :

    - (NSMethodSigature *)methodSignatrueForseletor:(sel)aselector{
    //当上一个方法返回nil或self时,进入该方法,返回一个方法签名,并由forwardInvocation:去执行
    }
    - (void)forwardInvocation:(NSInvocation *)anInvocation{
    //若上面方法不返回nil,则在这里调用自己对象的其他方法,也可以调用其它函数,以及多个不同对象的多个方法
    }
    
    

    isa指针指向

    image.png

    动态创建类

    类的动态创建,可以动态添加属性、成员变量、成员方法等,
    在类创建后不能在添加变量了,因为类的结构布局以及固定,本质原因是因为类的结构中有个常量 ro,它是class_ro_t,是只读结构体类型;

    动态绑定:

    SEL ——> IMP
    通过方法名找到IMP
    方法交互也就是改变SEL对应的IMP

    runtime的一些应用

    对象归档;
    属性关联;
    方法交换;
    一些切面类库中运用;
    待续...

    相关文章

      网友评论

          本文标题:iOS 的RunTime的相关知识(自己的一些总结概括)

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