OC方法底层调用过程
- 实际上是 objc_msgSend函数的调用
- objc_msgSend的执行过程大致分成三部分:消息发送 -> 动态方法解析 -> 消息转发
消息发送底层实现原理
image.png进入ENTRY _objc_msgSend 后 首先判断x0(消息接收者是否为nil), 如果为nil 跳转到 LNilOrTagged 直接 return 如图
image.png
不为nil, 消息接收者 isa指针 通过 and 做与操作 找到 isa 指向的类(LGetIsaDone) 然后从类中的缓存查找(CacheLookup) 如图
如果命中(CacheHit) 直接返回 imp 如图
image.png
如果未命中(CheckMiss) 调用方法 __objc_msgSend_uncached 如图
image.png
调用 __objc_msgSend_uncached 进入后会调用 MethodTableLookup (从方法列表中查找 imp) 如图
image.png
进入方法后 会跳转 __class_lookupMethodAndLoadCache3 (为C 函数方法, 汇编一C约定在汇编中方法名前多加一个下划线) 方法 如图
image.png
进入__class_lookupMethodAndLoadCache3方法后会调用 lookUpImpOrForward 方法
image.png
retry 会先在缓存中重新查找一次,找到 return imp 回到汇编进行调跳转(找到imp后会先添加到缓存在进行返回)。如果没有找到 会通过指针从父类的缓存、方法列表中查找 for 循环到 根类
初下笔,多包涵。😊
网友评论