objc_msgSend 执行流程

objc_msgSend 执行流程01 :消息发送

1、先判断消息发送者是否为空,如果为空,直接退出,如果不为空,就通过类对象的isa指针找到类对象的方法缓存数据,看看缓存数据里面是否有这个方法,如果有,直接调用,

2、如果没有,就去类对象的方法数组里面去查找这个方法(如果这个方法是排好顺序的,就用二分查找,如果是没有顺序的,就用普通查找),如果找到,直接调用,然后往缓存数组里面写入一条数据

3、如果没有,再通过superclass指针找到父类对象的,从父类对象缓存里面看看是否有这个方法,如果找到,直接调用,并且把方法缓存到消息接受者的类对象的缓存数据里面去。

4、如果父类的缓存数据里面没有,就去父类的数据列表里面去查找。如果找到,直接调用,并且把方法缓存到消息接受者的类对象的缓存数组和父类的缓存数组里面去5、如果在父类也没找到,再看看是否还有父类,重复3、4步的方法。

 

objc_msgSend 执行流程 2:动态方法解析

1、判断是否曾经做过动态解释,如果没有,就判断调用的方法是对象方法还是累方法,如果是对象方法,就调用+resolveInstanceMethod,如果是类方法+(BOOL)resolveClassMethod:(SEL)sel方法来动态解释方法, 如果已经动态解释过了,就会返回到上面的第一步,消息发送,如果这个时候,动态方法解释并没有实现对应的方法,就会进入第三阶段--消息转发

 

// 如果在类里面找不到对应的方法的视线,进会进入:动态方法解释,就是调用下面这个方法,如果这个方法不作任何处理,就会进入消息转发

+(BOOL)resolveInstanceMethod:(SEL)sel {

if(sel == @selector(test)) {

// 获取其他方法

struct method_t *otherMethod = (struct method_t *)class_getInstanceMethod(self, @selector(other));

NSLog(@"%s",otherMethod->sel);

// 动态添加test 对象方法

// imp 方法地址

//const char * _Nullable types 包括返回值和参数信息的字符串

class_addMethod(self, sel, otherMethod->imp, otherMethod->types);

return YES;

}

NSLog(@"%s",__func__);

return [super resolveInstanceMethod:sel];

}

 

+(BOOL)resolveClassMethod:(SEL)sel {

}

 

objc_msgSend 执行流程 03:消息转发

1、进入消息转发流程的话,首先会调用-(id)forwardingTargetForSelector:(SEL)aSelector 方法,如果返回空,就会调用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector,如果还是返回空,就会报错找不到方法

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值