Runtime底层解析 -消息机制: objc_msgSend()(一)

  • OC中的方法调用,其实都是转换为objc_msgSend函数的调用;
  • objc_msgSend的执行流程可以分为3大阶段:
  1. 消息发送;
  2. 动态方法解析;
  3. 消息转发。

objc_msgSend()实现

1.消息发送阶段:
  • objc-msg-arm64.s
  1. ENTRY _objc_msgSend
  2. b.le LNilOrTagged
  3. CacheLookup NORMAL
  4. .macro CacheLookup
  5. .macro CheckMiss
  6. STATIC_ENTRY __objc_msgSend_uncached
  7. .macro MethodTableLookup
  8. __class_lookupMethodAndLoadCache3
  • objc-runtime-new.mm
  1. _class_lookupMethodAndLoadCache3

  2. lookUpImpOrForward

  3. getMethodNoSuper_nolock(cls, sel)、search_method_list、log_and_fill_cache

    1. 先在当前类的cacha中查找;
    2. 没找到,在当前类class_rw_tmethods方法列表中查找,找到后缓存到当前类的cache中。
      a. 如果排好序了,二分查找;
      b. 如果没排好序了,遍历查找。
  4. cache_getImp、log_and_fill_cache、getMethodNoSuper_nolock(curClass, sel)、log_and_fill_cache

    1. 如果当前类没找到,去父类的父类的方法列表中查找,找到后缓存到当前类cache中。
    2. 如果父类缓存没找到,去父类的的方法列表中查找,找到后缓存到当前类cache中。
  5. _class_resolveInstanceMethod

  6. _objc_msgForward_impcache


流程图:
Runtime底层解析 -消息机制: objc_msgSend()(一)_第1张图片
  • 类对象结构图:
Runtime底层解析 -消息机制: objc_msgSend()(一)_第2张图片

你可能感兴趣的:(Runtime底层解析 -消息机制: objc_msgSend()(一))