美文网首页
二十三、Runtime之(七)方法-objc_msgSend()

二十三、Runtime之(七)方法-objc_msgSend()

作者: yqc5521 | 来源:发表于2019-04-26 11:43 被阅读0次

一、由于objc_msgSend方法调用频繁,苹果直接利用汇编实现(苹果源码是有C、C++、汇编实现)。

1.汇编字符:b为跳转的意思,le是小于等于的意思,整体理解是如果x0(寄存器)小于等于0,即消息接受者为nil的时候,跳转到LNilOrTagged方法,执行LReturnZero方法,即return
整体理解:如果消息接受者为空,就直接返回,不做任何操作。

如果不为空,就执行CacheLookup方法,即查找缓存。
源码解读:
CacheHit,表示缓存命中,即从缓存中找到方法。
CheckMiss,表示查找失败,即没有从缓存中找到该方法。

如果查找失败,就会去方法列表中查找方法。[图片上传中...(屏幕快照 2019-04-26 下午1.51.17.png-682227-1556257882121-0)]

1.objc_msgSend


objc_msgSend汇编实现
  1. LReturnZero


    LReturnZero
  2. CacheLookup


    CacheLookup
  3. CheckMiss


    CheckMiss
  4. MethodLookup


    MethodLookup
  5. _class_lookupMethodAndLoadCache3(通过C语言实现,汇编函数名 " ",则对应的C语言函数是以""开头的。
    __class_lookupMethodAndLoadCache3
    _class_lookupMethodAndLoadCache3
    7.lookupImpOrFoward
    lookupImpOrFoward方法实现1
    lookupImpOrFoward方法实现2
    8.getMethodNoSuper_nolock
    getMethodNoSuper_nolock
    9.search_method_list
    search_method_list
    10.findMethodInSortedMethodList(二分法查找,适用于排好序的数组)
    findMethodInSortedMethodList
    11.log_and_fill_cache(找到该方法,先进行缓存)
    log_and_fill_cache
    12.cache_fil(缓存填充)
    cache_fil
    13.cache_fil_nolock(缓存填充)
    cache_fil_nolock

相关文章

网友评论

      本文标题:二十三、Runtime之(七)方法-objc_msgSend()

      本文链接:https://www.haomeiwen.com/subject/zhhfnqtx.html