经过之前博客的介绍,这个博客咱们来介绍objc_msgSend,信赖许多小伙伴在面试的时分,常常遇到面试官问:你知道runtime的音讯机制吗?等等关于runtime的知识点,学会了runtime不止让咱们面试中能添加亮点,也会为咱们开发中行进许多便当!

经过这个博客你将学习面试毛遂自荐到音讯机制的三大阶段的音讯发送具体是怎样实施的,具体的介绍底层乃至汇编语言实施的进程,具体仔细面试问题学习下来你会收成不少!好了,源码超市话不多说,lets begin!

objc_msgSend三大阶段:音讯发送、动态办法解析、音讯转发

首要咱们仍是先由简略到杂乱,条件引入

其他的基础知识我就不介绍了,直接进入正题,请看面试常见问题及答复技巧下面的代码:我是源码编程创建了源码一个继承面试技巧和注意事项NSObje缓存文件在哪里ct的GDPerson的类,创建了personTest办法,里边打印缓存视频怎样转入本地视频了办法姓名如下:

超级具体的Runtime的音讯机制的音讯发送阶段

现在把上面面试毛遂自荐简略大方的代码转成c++代码,咱们看一下底层是怎样结束的(划到最下面面试毛遂自荐,找到main函数结束)如下图:( xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp)

超级具体的Runtime的音讯机制的音讯发送阶段

调用personTest底层源码

很清楚的看到,调用personTest便是经过音讯机制objc_msgSend来处理的,现在咱们看一下sel_regis面试毛遂自荐简略大方terName(“personTest”)这是什么鬼?你能够看一下定义,其实和之前的@selector(缓存视频怎样转入本地视频personTest),是一摸相同,接下源码超市来咱们证明一下

sel_registerName(“personTest”) == @源码编辑器selector(personTest)

请看下图:

超级具体的Runtime的音讯机制的音讯发送阶段

能够看出地址都是一摸相同,说明完全是等价的.

所以oc中的调用办法是经过objc_msgSend来发送的面试技巧,好,接缓存和下载的差异下来咱们看看关键.

objc_msgSend的实施流程缓存的视频怎样保存到本地

objc_msgSend的实施流源码之家程能够分为三大阶段

1.音讯发送

首要咱们来源码跟读一下,下载苹果objc最新源码,为这儿下载的是787(苹果源码下载地址)

首要全局查找:objc_msgSend

超级具体的Runtime的音讯机制的音讯发送阶段

终究咱们会找到arm64里边的(iphoneos是arm64位),ENTRY是进口源码超市,接下来咱们就大致看一下缓存和下载的差异汇编面试技巧和注意事项的结束如下:

超级具体的Runtime的音讯机制的音讯发送阶段

虽然看不懂详缓存文件在哪里细的,大致咱们仍是能看懂,我这样一符号,应该是很清楚了,接下来咱们看一下

CacheLookup NORMAL, _objc_面试必问10大问题答复msgSend,记住这个NORMAL,咱们直接查找CacheLookup,看姓名咱们都知道是缓存查找,接下来请看下面的面试毛遂自荐一分钟截图

超级具体的Runtime的音讯机制的音讯发送阶段

接着就找CheckMiss的结束,看看它是怎样操作

超级具体的Runtime的音讯机制的音讯发送阶段

接下来咱们就查找 __obj源码编辑器手机版下载c_msgSend_unc源码超市ached (故名思义是uncached,也便是没找到缓存)

超级具体的Runtime的音讯机制的音讯发送阶段

接着就在Me面试毛遂自荐3分钟通用thodTableLookup里边找,也便是办法列表里边找,由于缓存没找到,咱们持续看结束

超级具体的Runtime的音讯机制的音讯发送阶段

然后咱们再在这个文件查找_lookUpImpOrForward办法,你会发现找不到了(这个不截图了),这个就面试毛遂自荐一分钟是汇编的终究一步,那怎样办呢?缓存咱们就去全局查找,看看c++语言有没有结束,这个时分你会发现能找到(留心_lookUpImpOrForward,在汇编语言会多一个_缓存视频兼并,咱们缓存视频在手机哪里找平常项目打印的时分也能看到,所以你查找的时缓存视频怎样转入相册分直接搜lookUpImpOrForward),仍是查找结束面试必问10大问题答复,你会发现你能找到如下的代码:

超级具体的Runtime的音讯机制的音讯发送阶段

缓存视频在手机哪里找看下面源码本钱的结束,仍是上面那张图的办法结束里边

超级具体的Runtime的音讯机制的音讯发送阶段

上面那个 ge面试必问10大问题答复tMethodNoSuper_nolock 这个便是咱们常常说的,拿到这个sel到类政策里边去查找办法,一会咱们再看怎样去类政策里边查找,先看其他的,接下来咱们就会去看log_and_源码年代fill_cache这个办法的具体结束(听姓名也知道是fill_cache,找到往后填充缓存)请看下图

超级具体的Runtime的音讯机制的音讯发送阶段

接着咱们看cache_fill办法的结束:

超级具体的Runtime的音讯机制的音讯发送阶段

接下来看insert结束:

超级具体的Runtime的音讯机制的音讯发送阶段

到这儿根本的流程,第一次阶段的音讯发送就走完了!咱们再看

getMethodNoSuper_n面试毛遂自荐简略大方olock怎样查找method

超级具体的Runtime的音讯机制的音讯发送阶段

持续查找search_method_list_inline

超级具体的Runtime的音讯机制的音讯发送阶段

findMethodInSortedMetho缓存视频dList 是查找排好序的查找.

源码共享网了,整个音讯机制的第一个阶段音讯发送的底层源码便是这些,

接下来咱们总结一下上面说的流程

2.音讯发送的流程总结:

接下来我用一张图来解释这个流程

超级具体的Runtime的音讯机制的音讯发送阶段

音讯发送进程详解图

假设你在记住类中,自己的缓存中以及父类的缓存中,父类中都找不到这个办法,那怎样办呢?这就会到咱们objc_msgSend第二阶段动态办法解析,剩余的下一篇博面试客说吧,一次写太多,写得累,读得也源码之家累,哈哈!

接下来博客源码编程我会介绍runtime的-objc_msgSend的第二三阶段以缓存文件在哪里及实践运用,来持续学习runtime.

假设觉得我写得对您有所帮忙,请注重我,我会源码编程持续更新