iOS方法在runtime中的调用流程

Runtime中具体的方法调用流程

  1. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应的实现并执行;
  2. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应的实现并执行;
  3. 如果没找到,去父类指针所指向的对象中执行1、2;
  4. 以此类推,如果一直到根类都没有找到,转向拦截调用,走消息转发机制
  5. 如果没有重写拦截调用方法,程序报错;

拦截调用

在方法调用中说到了,如果没有找到方法就会转向拦截调用。
那么什么是拦截调用呢?
拦截调用就是,在找不到调用的方法程序崩溃之前,你有机会通过重写NSObject的四个方法来处理:

+ (BOOL)resolveClassMethod:(SEL)sel;
+ (BOOL)resolveInstanceMethod:(SEL)sel;
//后两个方法需要转发到其他的类处理
- (id)forwardingTargetForSelector:(SEL)aSelector;
- (void)forwardInvocation:(NSInvocation *)anInvocation;

拦截调用的整个流程即Objective-C的消息转发机制。其具体流程如下图:
流程图

[image:A6043816-2585-4477-BE08-5C38F761E7E6-417-00001981CC42BFC1/message_forwarding.png]
由上图可见,在一个函数找不到时,runtime提供了三种方式去补救:

  1. 调用resolveClassMethod:(SEL)sel给个机会让类添加这个实现这个函数
  2. 调用forwardingTargetForSelector:(SEL)aSelector让别的对象去执行这个函数
  3. 调用forwardInvocation:(NSInvocation *)anInvocation(函数执行器)灵活的将目标函数以其它形式执行

如果都不中,调用doesNotRecognizeSelector抛出异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值