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

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指针指向

iOS 的RunTime的相关知识(自己的一些总结概括)_第1张图片
image.png

动态创建类

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

动态绑定:

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

runtime的一些应用

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

你可能感兴趣的:(iOS 的RunTime的相关知识(自己的一些总结概括))