一、由于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

-
LReturnZero
LReturnZero
-
CacheLookup
CacheLookup
-
CheckMiss
CheckMiss
-
MethodLookup
MethodLookup
- _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
网友评论