iOS底层原理11:消息转发

音讯转发引进

instrumentObjcMessageSends办法的运用

在上一篇文章中咱们介绍了通过办法挑选的办法来处理未结束的办法溃散问题;但明显这种一ios体系刀切的办法并不可appreciate取;那么ios14.4.1更新了什么除此之外,咱们还有其他办法来处理么?

iOS底层原理11:音讯转发

咱们剖析通过sel寻觅imp的进程发现,毕竟还调用了log_and_fill_cache办法:

iOS底层原理11:音讯转发

里边的logMessageSend办法会记载办法调用的日志流程,implementerClass能够确认是存在的,那么只需求obappearancejcMsgLogEnabled的值为YES,那么就能够记载办法调用的日志信息了:

iOS底层原理11:音讯转发

日志信息存储途径为/tmp/msgSends-%d,那么假设给objcMsgLogEnable架构师工资一月多少d赋值为true呢?在源码中查找objcMsgLogEnabled:

iOS底层原理11:音讯转发

apple id暗码重置现在办法instrumentObjcMessageSappetiteends中会给objcMsgLogEnabled赋值,那么通过调用此办法,就能够输入方apple store法调用的日志信息了。

咱们先来看一下app store没有结束的talk办法,在实施进程中的日志输出:

工程有必要是个mac工程开源是什么意思,比如Command Lios下载ine Tool工程

iOS底层原理11:音讯转发

作业之后,毕竟生成日志架构师文件:

iOS底层原理11:音讯转发

咱们翻开日志文件,日志如下:

iOS底层原理11:音讯转发

刚才咱们打印的是政策办法的调用,接下来咱们看一下类办法的调用:

iOS底层原理11:音讯转发

生成文件如下:

iOS底层原理11:音讯转发

能够看出类办法政策办法多调用了resolveClassMethod,我开源软件们首要研ios15讨红框内的几个方ios14.4.1更新了什么法即ios8备忘录可,其他的都是objc的底层调用的输出内容;resolveInstanceMethodresolveClassMethod办法在之前的文章中咱们现已介绍appear过了,也知道了其调用两次的原因,那么forwardingTargetForSelec开源是什么意思tormethodSignatureForSelectordoesNotRecappearognizeSelector是什么呢?这便是咱们接app id注册下来要了解的音讯转发流程

音讯转发

快速转发 forwardingTargetForSelector

接下来,咱们以政策方apple id暗码重置的调用来剖析音讯转发的流程;在之前的文件中咱们看到了app id注册forwardingTarg开源众包etFo架构设计rSelecto开源节流r办法的调用,那么这个办法是做什么的呢?

Returns the object to w架构图模板hich unrecognized messages should first be directed.

大意是回来这个音讯(unrecognized messages)应该首要指向的政策,也便是咱们需求将这个无法辨认的音讯重定向给另一个政策,然后看这个政策能否调用;咱们现在Teacher类中增加forwardingTargetForSelector的默许结束:

iOS底层原理11:音讯转发

能够看到,尽管依然没有解决溃散问题,但是forwardingTargetForSe架构师工资一月多少lector办法被成功调用,那么接下来在forwardingTargetForSelector中把办法重定向给其他政策呢?

新建apple tv一个Student类,在Studapple watchent中结束talk办法,留意并不承继Person

@i开源nterface Student :ios15描绘文件 NSObject
@end
@implemenappearancetation Student
- (void)talk {
NSLog(@"%s", __func__);
}
@end

然后在forwardingTargetForSelector中,将其重定向给Student类的政策:

iOS底层原理11:音讯转发

能够看到调用成果:Stuappreciatedent类中的办法talk被调用,并且StudentPerson开源阅览Teacher并无任何承继上的联络;

这是一个快速转发的流程;

慢速转发 meios8备忘录thodSignatureForSelector

那么假app id注册Student也没有结束talk办法成果会怎么呢?依据咱们在日志文件中打印的办法实施流程能够知道,假设studenios下载tios8备忘录没有结束talk,那么必然会继续报错,实施me开源节流thodSignatureForSelector办法,那么这个办法是什么意思呢?

Returns an NSMethodSignature object that coappstorentains a description of the method开源 identiapple storefied by a given selector.
Relappstoreated Documentation
- forwaiOSrdInvocation:
Overriddenapple store by subclasses to forward messages to other objects.

这个办法将会回来一个NSMethodSiappearancegnature政策,其包含了被调用架构师工资一月多少的办法的描绘信息,也便是签名;并且,他需求与forwardInvocation:办法一同运用:

iOS底层原理11:音讯转发

能够看到现已被methodSignatureForSelector阻挠到,接下来补全forwardInvocation:办法的结束,forwardInvocation:用来解读签名,与methodSignatureForSelector一同运用:

iOS底层原理11:音讯转发

v@:解读:

  • v标明void类型,标明talk的回来值
  • @标明调用者类型self,即id类型
  • :标明SEL

从头到尾talk没有被结束,假设需求处理能够apple payforwardInvocation办法中获取到进行处理,不然将会办法将会流失掉;

iOS底层原理11:音讯转发

hopper反汇编

接下来咱们运用开源代码网站githubhopper东西来通过反汇编来剖析音讯转发ios下载;

作业原本的代码,在项目溃散时,运用bt指令来查看仓库信息:

iOS底层原理11:音讯转发

在仓库中清楚看到之前ios体系调用日志中的办法doesNotRecognizeSelector,能够确认doesNotRecognizeSelectorCoios15正式版本什么时候发布reFoundation框架中,并且是___fapple官网oios体系rwarding____CF_forwarding_prep_0触发的,那么咱们测验在CoreFoundation的源码中剖析

Coapple id暗码重置reFoundation源码下载

但是,不管是forwarding仍是forwarding_prep_0,在源码中都没有找到任何蛛丝马迹,看来源码剖析无法走通,Apple并未开源这部分代码;

那么咱们能够直接去看CoreFoundation的可实施文件进行反汇编剖析:

CoreFoundation无缺途径如下:

/Applications/Xcode.app/Contios模拟器ents/Developeapp是什么意思r/Platfo开源是什么意思rms/iPhoneOS.platform/Library/Developer/CoreSimulator/ios最好玩的手游Profiles/Runtimes/iOS.simruntime/Contents/Resourcesapple id/RuntimeRoot/Sy架构师工资一月多少stem/Library/Fappointmentrameworks/CoreFoundation.framework/CoreFios模拟器oundation

接下来运用hopper来进行反汇编剖析,将可实施文件运用架构师工资一月多少hopper翻开,挑选x86(64 bits)架构:Apple

iOS底层原理11:音讯转发

从仓库信息中咱们能够清楚是forwarding_prep_0触发了forwarding,那么咱们以forwarding_prep_0切入口appstore进行剖析:

iOS底层原理11:音讯转发

咱们以伪代码的办法来剖析其流程,无缺流程如下:

iOS底层原理11:音讯转发

针对汇编剖析,流程如下

iOS底层原理11:音讯转发

音讯转发机制流程图

iOS底层原理11:音讯转发

发表评论

提供最优质的资源集合

立即查看 了解详情