runtime理解

2019-05-05  本文已影响0人  DL是谁

OC对象主要可以分为3种

1、instance对象(实例对象):instance实例对象就是通过alloc出来的对象,每次调用alloc都会产生新的instance对象
2、class对象(类对象):每个类的内存中有且只有一个类对象
3、meta-class对象(元类对象):每个类的内存中有且只有一个元类对象
实例对象的存储信息

isa指针


WechatIMG515.png

Runtime 消息执行过程
1.首先编译器会将代码[receiver message];
2.转化为objc_msgSend(receiver, @selector (message));,
3.在objc_msgSend函数中,首先通过obj的isa指针找到obj对应的class。
4.在Class中先去cache中 通过SEL查找对应函数method,若 cache中未找到。
5.再去类的分派表中查找,若分派表中未找到,则取superClass中查找,如此一致回溯至NSObject类。
6.若能找到,则将method加入到cache中,以方便下次查找,并跳转到对应的函数中去执行。
7.若没找到方法则之心消息转发

Runtime消息转发
1、动态解析,能在resolveInstanceMethod或+ (BOOL)resolveClassMethod:(SEL)sel来来拦截,可以给class新增实现函数,使用这种办法的前提是:相关方法代码已经实现,只是在运行时将改方法动态添加到目标类中。

2、+ (id)forwardingTargetForSelector:(SEL)aSelector或- (id)forwardingTargetForSelector:(SEL)aSelector拦截类或实例方法,能将对象方法转发给其他对象,也能将对象方法转发给类方法,也可以将类方法转发给实例方法

3、经历了前两步,还是无法处理消息,那么就会做最后的尝试,先调用methodSignatureForSelector:获取方法签名,然后再调用forwardInvocation:进行处理,这一步的处理可以直接转发给其它对象,即和第二步的效果等效,但是很少有人这么干,因为消息处理越靠后,就表示处理消息的成本越大,性能的开销就越大。所以,在这种方式下,会改变消息内容,比如增加参数,改变选择子等等

Runtime应用

关联对象给分类增加属性
方法魔法(Method Swizzling)方法添加和替换和KVO实现
消息转发(热更新)解决Bug
实现NSCoding的自动归档和自动解档
实现字典和模型的自动转换

上一篇 下一篇

猜你喜欢

热点阅读