Runtime浅析

1).Runtime消息传递

  1.通过hash算法,先从缓存中查找,找到,调用方法结束流程;

  2.没有找到,则取当前类的方法列表中查找,找到,调用方法结束流程;

  3.没有在当前类的方法列表中找到,则取逐级父类方法列表中查找,找到,调用方法,加入当前方法缓存中,再结束流程;

  4.以上都没有找到,进入方法动态解析,转入消息转发流程。

2).消息转发流程:

 

  1.调用动态解析方法resolveClassMethod:(SEL)sel,如果动态添加方法(调用class_addMethod函数)并返回YES,则流程结束;

  2.函数上一步没有实现动态添加方法,不管返回YES or NO,都会调用消息接受者重定向forwardingTargetForSelector方法,如果返回重定向接受者,则当前流程结束;

3.如果返回上一步nil,则会调用methodSignatureForSelector获取函数的参数和返回值类型,同时调用forwardInvocation消息通知当前对象;

4.如果上一步返回nil,消息无法处理, App crash。

 

3).继承关系:

  1.实例对象(instance)的isa指针指向类对象(class),类对象的存放实例方法(-);

  2.类对象(class)的isa指针指向其元类对象(meta),元类对象存放方法(+);

  3.根类对象(root class)的isa指针指向根元类对象(root meta),superclass指针指向nil;

  4.根元类对象(root meta)的isa指针指向自己,superclass指针根类对象(root class);

  总结:实例方法查找是沿着其superclass指针逐级父类查找,终于根类对象(root class)。而类方法(+方法)查找是沿着其superclass指针逐级父类(meta)查找,终于根类对象(root class),如果根类对象存在同名实例方法,则会调用同名实例方法

 

4).Runtime实际运用:

  1.给NSTimer定时器声明一个中间类Proxy(消息转发);

  2.通过runtime动态获取类的所有属性(json转model、可归档类对属性的归档及解归档操作);

  3.反射机制(NSClassFromString,CTMediator原理);

  4.交换系统方法(比如交换viewController声明周期方法,从而进行统一埋点等操作);

  5.给分类添加属性(通过管关联对象,实现getter,setter方法);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值