Runtime底层解析 -消息机制: objc_msgSend(
2019-11-11 本文已影响0人
南城同學
- OC中的方法调用,其实都是转换为
objc_msgSend
函数的调用; -
objc_msgSend
的执行流程可以分为3大阶段:
- 消息发送;
- 动态方法解析;
- 消息转发。
objc_msgSend()实现
1.消息发送阶段:
- objc-msg-arm64.s
ENTRY _objc_msgSend
b.le LNilOrTagged
CacheLookup NORMAL
.macro CacheLookup
.macro CheckMiss
STATIC_ENTRY __objc_msgSend_uncached
.macro MethodTableLookup
__class_lookupMethodAndLoadCache3
- objc-runtime-new.mm
-
_class_lookupMethodAndLoadCache3
-
lookUpImpOrForward
-
getMethodNoSuper_nolock(cls, sel)、search_method_list、log_and_fill_cache
- 先在当前类的
cacha
中查找; - 没找到,在当前类
class_rw_t
的methods
方法列表中查找,找到后缓存到当前类的cache
中。
a. 如果排好序了,二分查找;
b. 如果没排好序了,遍历查找。
- 先在当前类的
-
cache_getImp、log_and_fill_cache、getMethodNoSuper_nolock(curClass, sel)、log_and_fill_cache
- 如果当前类没找到,去父类的父类的方法列表中查找,找到后缓存到当前类的
cache
中。 - 如果父类缓存没找到,去父类的的方法列表中查找,找到后缓存到当前类的
cache
中。
- 如果当前类没找到,去父类的父类的方法列表中查找,找到后缓存到当前类的
-
_class_resolveInstanceMethod
-
_objc_msgForward_impcache
流程图:
- 类对象结构图: