runtime之动态添加方法(动态决议,请求转发)

runtime中实例变量调用方法的步骤
1.在该实例变量的方法缓存列表中查找方法,如果找到就执行。
2.如果没找到,会在该类结构的方法列表中查找该方法,如果找到就执行。
3.如果没找到,会在该类的父类重复步骤1、2。
4.如果知道根类没找到,就会报错: unrecognized selector sent to instance 0x1005046c0.

解释:
类结构:
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
    Class super_class                       OBJC2_UNAVAILABLE;  // 父类
    const char *name                        OBJC2_UNAVAILABLE;  // 类名
    long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
    long info                               OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识
    long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小
    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 该类的成员变量链表
    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的链表
    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法缓存
    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 协议链表
#endif
} OBJC2_UNAVAILABLE;

实例变量的方法缓存列表:常用的方法存在cache列表中,这样查找效率高,如果cache中查找不到,再在methodList中查找,找到后,把方法添加到cache中。在父类中找到方法,添加到自己的cache列表中,而不会添加到methodList中。
类结构的方法列表:methodList,存储该类所有方法。

也就是说
1、重写父类的方法,本质上不是覆盖了父类的方法,只不过是在本类中找到相应的方法,不再去父类中查找方法而已。(即在本类的methodList方法中,添加该方法)
2、super关键字并不是指父类,作用是 跳过此类直接从父类中进行查找方法

动态决议以及请求转发就是拦截上述过程,让其在runtime中运行相应的方法。

动态决议:
请求转发:
如果动态决议和请求转发都实现了,那么动态决议的优先级要高于请求转发.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值