消息发送objc_msgSend()
- 从
cache
缓存中查找方法,找到了直接调用 - 从
class_rw_t
方法列表中查找,找到了缓存到cache
,再调用 - 从
superClass
缓存中查找,找到了缓存到cache
,再调用 - 从
superClass class_rw_t
方法列表中查找,找到了缓存到cache
,再调用 - 递归父类查找,直到父类为空,执行下一步动态方法解析
动态方法解析
- 若未动态解析过,则调用
resolveInstanceMethod:
resolveClassMethod:
来完成方法添加 - 不管有没有实现,都会再次走上一步的方法查找
- 若找到则执行并结束
- 没找到则执行下一步消息转发
消息转发
- 调用
forwardingTargetForSelector:
- 不为空则走
objc_msgSend
向转发的对象发送消息调用 - 返回值为nil,调用
methodSignatureForSelector
- 不为空则走
methodSignatureForSelector
返回为空 则crash- 不为空则调用 ForwardInvocation方法,在里面可以手动invoca和获取修改invoca的所有属性,包括target,methodSignature,selector
super 关键字
[self class] 与 [super class] 结果一样,因为super关键字底层实现是调用
objc_msgSendSuper({self, class_getSuperClass('selfClass')}
, sel_registerName('class'))
, objc_msgSendSuper
意义是从父类开始查找class方法,但是方法接收者还是self, 所以才能实现跳过自己,直接调用父类的方法。
class方法的实现是objc_getClass(self), 因为前面接收者是self,所以方法实现里的参数还是自己,那么打印出来就是一样的。