011-消息的动态转发流程(下)

经过这篇文章能够取得什么

  • instrumentObjcMessageSends辅佐剖析办法的介绍
  • 动态音讯转发的一般根究思路
  • 动态音讯转发之快速转发
  • 动态音讯转发之慢速转发
  • 动态音讯转发之真实场景避免溃散
  • 动态音讯转发之人体接受的最大电压逆向根究办法
  • Core开源代码网站githubFoundation与Hopper的资源获取
  • Hopper伪代码分解CoreFoundation的音讯转发流程
  • 音讯的动态转发机制流程图

instrumentObjcMessageSends辅佐剖析办法的介绍

作用

能够打印出指定区域内调用的全部的办法

开源是什么意思用办法

// 外部引证定义
ex开源节流tern void instr人头攒动的近义词umentObjcMessagertc是什么意思Se闰土刺猹nds(开源是什么意思BOOL flag);
//运用区域,将想要查找的方开源众包法用instrumentObjcappreciateMessageSends圈起来
//开始监听传递参数为YES,完毕监听传递参数为NO
FFPerson *person = [FFPerson allo源码本钱c];
instrumentObjcMessageSends(YES);
[appetiteperson likeGirls];
instrumentObjcMessageSends(NO);

假定检查作用

此办法将人头攒动指定函数开始完毕之间调用的函数悉数以源码之家的办法输出,存储途径为:tmpmsgSends,找到msgSends-xxxx的文件,此文件内便是悉数调用的函数了。

查找流程图解:
011-音讯的动态转发流程(下)

源码所在位置

当objcMsgLogEnabled为true的时分,将记载这中心调用的全部的办法

void instrumentObjcMessageSends(B苹果手机OOL flag)
{
bool enabl苹果12e = flag;
// Shortcut NOP
if (objcMsgLogEnabled == enable)
return;
// If enabling, flus源码编辑器编程猫h all method ca源码ches so we get some traces苹果13
if (enable)
_objc_flush_caches(Nil);
// Sync our log fi人体接受的最大电压le
if (objcMsgLapplicationogFD != -1)
fsync (objcMsgLogFD);
objcMsgLogEnabled = en源码编辑器able;
}

为什么会关注到instrumentObjcMessageSends

因为音讯的动态办法挑选之后全部能够看到源码的流程现都现已走完了,那么根究也就中止闰土刺猹图片,还好有那个骚气的男人发现了这个办法,让根究由可知的源码向未开源的源码根究.....苹果8.

一般根究思路

经过instrumentObj开源是什么意思cMeapplicationssageSends打开天主视角

快速转发

经过上面msgSends-16848文件看到了了解的resolveInstanceMethod,这个办法是动态方人头攒动的近义词法挑选,看到下一个办法forwardingTargetForSelector就变成了根究最新的条理,已然没有源码,那么就检查一下官方文档,在Develapproachoper Decumentation中查找
011-音讯的动态转发流程(下)
经过此文档能够得知forwarding源码本钱TargetForSelector源码是什么意思为快速转发流程的一个执行者,假定运用此办法对某一个函数进行重定向,那么将非常的有用。forwardingTargetForSelector会回来一个政策,成为未识别的音讯的第一继承者人头攒动,即办法的重定向苹果官网。假定你想要更多的操作安闲源码年代训练怎么样,请用forwardInvocation进行操作。

阶段一:代码开始证明

案例代码:

@interface FFPer乳糖操纵子son : NSObject
- (void)likeGirls;
@end
@implementaappeartion FFPerson
//likeGirls办法未完毕
//快速转发
- (id)forwardingTargetForSelector:(SEL)aSelector {
NSLog(@"%s - %@",__开源func__,NSStringFromSelector(aSele开源矿工ctappreciateor));
return [super forwardingTargetForSelector:aSe人头攒动的近义词lector];
}
@eAPPnd
int main(人头攒动的近义词int ar人头攒动的近义词gc, const char * argv[]) {
@autoreleasepapp是什么意思ool源码本钱 {
FFPerson *person =人头攒动的近义词 [苹果官网FFPerson all源码oc];
[person likeGirls];
}
return 0;
}

控制台打印:

202苹果1-07-04 23:58:17.970363+0800 002-in开源代码网站githubstrumentObjcMessageSends辅佐剖析[17126:1382603] -[FFPerson forwardi苹果手机ngTargetForSelector:] - likeGirls
2021-07-04 23:58:17.972060+08苹果700 002-instrumentO开源软件bjcMessageappointmentSends辅佐剖析[17126:1382603] -RTC[FFPerson likeGirls]: unrecognized selector sent to instance开源基金会 0x10055fa30

作用是溃散,可是在溃散之前打印了-[FFPerson forwardingTargetForSAPPelector:] - likeGirls,证清楚上述的根究方向是OK的,在此进程能够对办法进行重定向,以避免程序crash

阶段二:对闰土刺猹代码进行了进一步改动

创立一个FFBoys的类,FFBoys.h文件中苹果不声明任何办法,在FFBoys人头攒动.m文件中完毕likeGirls实例办法

@in源码terface FFBoys : NSObject
//为声明源码本钱任何办法
@end
@implementation FFBoys
//完毕了likeGirls办法
- (void)likeGirls {
NSLog(@"%s",__func__);
}
@end
@interfac开源节流e FFPerson : NSObject
//声清楚likeGirl苹果7s实例办法
- (void)likeGirls;
@end
@im开源基金会plementation FFPerson
//并未完毕likeGirls实例办法
//快速转发
- (id)forwardingTargetF苹果8plusorSelector:(SEL)aSelector {
NSLog(@app是什么意思"%s - %@",__func__,NSStringFromSelector(aSelector));
//此刻将FFPerson的实例办法likeGirls发送到了FFBoys,让FFBoys来完毕
return [FFBoys alloc];
}
@end

控制台打印作用:

2021-07-05RTC 00:07:17.270104+0800 002-instrumentObjcMessageSends辅佐剖析[17170:1388173] -[FFPerson forwardingTargetForSelector:] - likeGirls
2021-07-05 00:07:17.270736+0800 002-instrumentObjcMessageSeapplends辅佐剖析[17170:1388173] -[FFBoys likeGirls]

能够很apple清楚的得知FFPerson的实例源码是什么意思办法likeG源码编辑器编程猫irlsFFBoys完毕了。源码编辑器手机版下载

疑问点一:为什么好好的办法,不在FFPerson类中自己完毕,还要启用快速转发,由FFBoys来完毕呢?appointment

阶段三:定制一个背锅侠,动态增加新办法

- (id)forwardingTargetForSelector:(SEL)aSelector {
NSLog(@"%s - %@",__func__,NSStringFromSelector(aSelector));
FFBoys * boys = [FFBoys alloc];
//动态刺进办法
return [super forwardingTargetForSelector:aSelector];
}

慢速转发人头攒动

FFBoys这个背锅侠不想源码编辑器手机版下载背锅的时分,他源码之家苹果8plus不想完毕这个办法,那么此刻就会进入到慢速转发了。也便是m源码之家sgSends-16848methodSignatureForSelector办法,运用相同的办法,那么就检查一下官方开源矿工文档,在Develo源码编辑器手机版下载per Decumentation中查找:
011-音讯的动态转发流程(下)
给定一个sel,回来一个办法的签名,跟forwardInvocation相关运用,那么就检查一下官方文档,在Developer Decumentation中查找:
011-音讯的动态转发流程(下)

阶段一:methodSignatureForS苹果13elector

案例代码

@implementation FFPerson
//快速转发
- (id)forwardingTargetF源码年代训练怎么样orSel源码ector:(SEL)aSelector {
NSLog(@源码"%s - %@",__func__,NSStringFromSelector(aSelec开源节流是什么意思是什么tor));
FFBoys * boys = [FFBoys alloc];
//动态刺进办法
return [super forwardingT闰土刺猹argetForSelector:aSelector];
}
//慢速转发
- (NSMethodSignature *)methodSignatureForSelect开源代码网站githubor:(SEL)aSelector开源是什么意思 {
N闰土刺猹图片SLog(@"%s - %@",__func__,NSStringFromSelector(aSelector)源码交易网站源码);
return  [super methodSignatureForSelector:aSelector];
}
@end

控制台打印效开源阅读果:

2021-07-05 00:42人体接受的最大电压:17.app是什么意思146674+0800 002-instrumentObjcMessageSends辅佐剖析[17283:1407758] -[FFPerson forwappleardingTarge乳糖操纵子tForSe开源基金会lector:] - likeG苹果xsirls
2021-07-05 00:42:17.147110+0800 002-instrumentObjcMessageSends辅佐剖析[17283:1407758] -[FFPerson methodSignatureForSel源码本钱ector:] - likeGirls
2021-07-05 00:42:17.147231+0800 002-instrumentObjcMessageSends辅佐appstore剖析[17283:1407758] -[FFPerson likeGirls]: unrec苹果ognized sele苹果xsctor sent to instanceappstore 0x103851710

作用依然是溃散,这儿现已打印了methodSignatureForSelecto苹果13r,因为并未回来签名,并且未合作forwardInvocaappletion办法运用。

阶段二:forwardInvocation

案例代码:

@implementation FFPerappetiteson
//快速转发
- (id)forwardingTargetForS开源众包elector:(SEL)aSelector {
NSLog(@"%s - %@",__func__,NSStringFromSe源码本钱lector(aSelector));
FFBoys * boys = [FFBoys alloc];
//动态刺进办法
return [super forwardingTargetForSappreciateelector:aSelector];
}
//慢速转发
- (人头攒动NSMethodSignature *)methodSignatureForSelector:(applicationSEL)aSelector {
NSLog(@"%s - %@",__func__,NSStringFromSelector(aSelector));
if (aSelector == @selector(likeGirls开源软件)苹果xs) {
return [NSMethodSignature signatureWithObjCTyp苹果es:"v@:"]苹果官网;
}
return  [super met源码之家hodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
}
@end

我这儿经过判别sel是否是likeGirls开源众包并为其增加了办法签名,然后增加了forwardInvocation办法,可是并未完毕任何业务,这儿不会溃散

业务的概念

关于业务,methodSignatureForSelector开源阅读办法经过创立并回来一个办法签名之后,进入forwardInvocation,这个办法便是用来处理业务的,源码年代训练怎么样当苹果一系列的转发流程来到这儿,经过办法签名生成了一个业务,那么开源软件这个业务是苹果xs做可不做人头攒动的近义词,会保存anInvocation比如当你想起源码年代我的时分,你问源码年代训练怎么样我,在吗,我会答复你,我很好,一贯在等你。

代码验证:

- (void)forwardInvocation:(NSInvocation *APP)anInvocation {
NappreciateSLog(@"%@ - %@",anInvocation.target, NSStringFromSelector(anInvocation.selector));
}

控制台打印

2021-07-05 00:56:28.493284+0800 002-instrumentObjcMessageSends辅佐剖析[17350:1416427] -[FFPerson forwardingTargetForSelect苹果xror:] - likeGirls
2021-07-05 00:56:28.493856+0800 002-instrumentObjcMessageSends辅佐剖析[17350:1416427] -[FFPerson methodSignatureForSelector:] - likeGirls
2021-07-05 00:56:28.494254+0800 002-instrumentObjcMessageSends辅佐剖析[17350:1416427] <FFPer源码年代训练怎么样son: 0x104016a30> - likeGirlappstores

经过打印证清楚likeGirls开源基金会这个业务的存在,只需你苹果xr想我在的时分我一贯都在,这便是forwardI开源软件nvocation的涵义,当你不想找到我的时分,其时forwardInvocation乳糖操纵子就会当作什么源码编辑器编程猫appstore没发生过。此业务就会被丢掉,此为慢速转发流程

疑问点二:慢速转发流程与快速转发流程的差异是什么?

真实场景避免溃散

将慢速转发流程methodSignatureForSelector + forwardInvocation,放在NSObject的分类中完毕,那么程序就不会因为找不到办法而溃散了。仅仅假象的消失了,问题开源节流仍是真实存在的,并且对内存资源造成了更多的浪费,意味着在这个流程中必定经历了很多的剩余的办法和不必要的流程

慢速转发留意源码点:

要照顾您的政策自身无法源码本钱识别的办法,除了 forwardInvocation: 之外,您还有必要掩盖 methodSignatureForSelector:。 转发音讯的机制运用从 methodSignatureForSelector: 取得的APP信息来创立要转发的 NSInvocation 政策。 您的掩盖办法有必要为给定的挑选器供给恰当的办法签名,或许经过预先拟定一个或经过向另一个政策问询一个。

forwappleardInvocation完毕代码

- (void)forwardInvocation:(NSInvocation *)anInvocation {
NSLog(@"%开源软件@ - %@",anInvocation.target, NSStringFromSelector(anInvocation.selector));
FFBoys *boys = [FFBoys alloc]appreciate;
//假定自己能够处理,直接调用
if ([self respondsToSelector:anInvocation.selector]) {
[anInvocation invoke];
}
//判别FFBoys是开源是什么意思否能够处理,假定源码年代训练怎么样能够,直接调用
else if ([boys respon源码年代dsToSelector:aappearnInvocatiappearanceon.se开源软件lector]){
[anInvocation invokeWithTarget:boys];
}
//没有任何人源码本钱去完毕,那么这儿将过失上报
else {
NSLog(@"发生了过失的办法:%@ - %@",anIappetitenvocation.target, NSStringFromSelector(anInv开源代码网站githubocation.selector));
}
}

逆向根究办法

经过lldb动态人头攒动的近义词调试指令bt,打印其时的仓库
011-音讯的动态转发流程(下)

这儿能够得知调用likeGirls依然是溃散的,可是经过仓库信息能够找打溃散前都调用了那些函数doesNotRecognizeSelector,此开源软件个函数时当快速查找慢速查找都失效的时分会调用的办法,是属于coreFoundation框架下的,一起此办法的上两个办法一起也是coreFoundation库内的函数,不由得感觉到有鬼,有可能是条理

找Ap闰土刺猹图片ple的CoreFoundation源码

[Souece BrowseRTCr地址:opens闰土刺猹ource.apple.com/tarballs/CF…]

011-音讯的动态转发流程(下)

找到这儿,我觉得我又行了又站起来了。开始搞Core人体接受的最大电压Foundation源码

源码查找:___forwarding___forwarding

011-音讯的动态转发流程(下)
源码查找:_CF_forwarding_prep_0
011-音讯的动态转发流程(下)

经过一阵瞎逼操作,啥也没找到,毕竟得出结论CoreFoundation并没有彻底的开源,Apple爸爸仍是你爸爸。哎~不给你看。

去体系里边偷一个CoreFoundation反汇编调试

CoreFoundation动态库资源获rtc是什么意思人体接受的最大电压

CoreFoundati源码是什么意思on动态库资源和官网源码

Hopper Disasseapplembler反汇编东西介绍

官网地址:https://www.hopperapp.com/

011-音讯的动态转发流程(下)

根底功用介绍

011-音讯的动态转发流程(下)

根究开始,查找_CF_forwarding_pappetiterep_0与___forwarding___

011-音讯的动态转发流程(下)

这儿现已在对动态库CoreFoundation反汇编appointment中发apple现了_CF_forwarding_prep_0___forwarding___,并且苹果7发现了调用次序跟报错的仓库式共同的。可是看反汇编的让天秤倒追的星座难度比较大,Hopper给人头攒动的读音我们供给一开源基金会个更好的办法,经过伪代码的办法剖析一下___forwar人体接受的最大电压ding___都做了什么?

Hopper伪代码分解CoreFoundation的音讯转发流程

011-音讯的动态转发流程(下)

自此,音讯的快速转发与慢速转发全体流程现已人头攒动的读音根究完毕。

音讯的动态转发机制流程图

011-音讯的动态转发流程(下)

回答在源码根究进程中人体接受的最大电压提出的疑问点:

为什么好好的办法,不在FFPerson类中自己完毕,还要启用快速转发,由FFBoys来完毕呢?

办法的查找进程中,经过前面一些列的进程,到动态办法挑选,这儿办法找不到也人体接受的最大电压没有联络,再到苹果xrforwrtc是什么意思ardingTargetFor乳糖操纵子Selector,你告诉我谁有这个办法谁有相同的办法,即找一个背锅侠

慢速转发流程与快速转发流程的差异是什么?

慢速转发流程相关于快速转发流程,关于开发者来讲更加的源码年代训练怎么样安闲活络的感觉。开发者只需供给一个签名,这个签名能够经过办法直接得到的,接下来经过forwardInvocation能够想处理也能够不处理`。

发表评论

提供最优质的资源集合

立即查看 了解详情