看淘网
当前位置: 首页> 文章> 运行时间3月,objc msgsend前世(2)

运行时间3月,objc msgsend前世(2)

发布时间:2019-08-13 16:32:39 作者:xhs
运行时间3月,objc msgsend前世(2):('summary:dynamic binding和message forwarding上的dummies。\n获取进度:\n\nhyperlink runtime small overture,从runtime多态性中看到这个神秘的力量\nhyperlink runtime march,objc msgsend pass life(一个\nhyperlink runtime march,objc msgsend pass life(两个\nhyperlink运行时变化,在运行时隐藏的接口(i)超链接运行时变化,在运行时接口(ii)中隐藏的接口(ii)超链接运行时变化,objc-msgsend伪代码审阅\n pseudo代码\n//首先查看objc-msgsend方法的伪代码实现\n id-objc-msgsend(id-self,sel-op,…)\nif(!self)返回nil;\n//键代码(a)\n imp imp=class eu getMethodImplementation(self->isa,sel op);\nimp(self,op,…);//调用此函数,伪代码…\n \n//查找imp\nimp类\u getMethodImplementation(class cls,sel)\nif(!CLS!sel)返回nil;\nimp imp=lookupimportnil(cls,sel);\nif(!imp)\ncars only//执行动态绑定\n \nimp imp=lookupimportnil(cls,sel);\nif(!imp)return _objc _msgforward;//这是用于消息转发的返回imp。\n \n//遍历继承链以查找imp\nimp lookupimpornil(class cls,sel)\nif(!cls->the initialize())\n_class_initialize(cls);\n \n class curclass=cls;\n imp imp=nil;\ndo//首先检查缓存,如果没有缓存则重新生成,如果仍然没有缓存则查询父类\n if(!curclass)break;\nif(!curclass->cache)fill_cache(cls,curclass);\n imp=cache_getimp(curclass,sel);\nif(imp)break;\n while(curclass=curclass->superclass);//key code(b)\nreturn imp.\n \n\n超链接运行时3月的大部分伪代码,objc_msgsend last life this life(a)已解释Ed详细介绍了最后两个小问题:动态绑定。\n邮件转发。\n动态绑定\n动态绑定,按名称。如果调用某个类的方法,而该类及其父类都不实现该方法。然后我们在运行时将此方法绑定到类。以下是一个示例:\n//使用@dynamic指示不自动合成属性A的set和get方法。\n import<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface a:nsObject\n属性(非原子,分配)nsinteger a;\n@the end\n@implementation a.\n@dynamic a;\n@the end\n int main(int argc,char*argv[])\na*aObject=[[a alloc]init]\nnslog(@%ld,aObject)。a);//在这次行程中死亡\n \n\n//执行结果:崩溃,错误报告如下\n2017-01-09 21:25:06.929 block[28341:228218]-[A]:发送到实例0x60800000C580的无法识别的选择器\n\n返回到objc-msgsend的执行步骤,我们可以知道类A没有动态B绑定和消息转发,因此返回的IMP为空,并执行崩溃。让我们为它添加一个动态绑定方法。\n//代码\n导入<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface a:nsObject\n属性(非原子,分配)nsinteger a;\n@the end\n@implementation a.\n@dynamic a;\nint a(id self,sel cmd)\n返回1;\n \nsel+(bool)resolveinstancemethod:(sel)\n类addmethod([self class],@the selector(a),(imp)。a,“i@:”);\n返回yes;\n \n@the end\n int main(int argc,char*argv[])\na*aObject=[[a alloc]init]\nnslog(@%ld,aObject)。a);\n \n \n//2017-01-09 21:50:11没有崩溃和输出1。314块[30605-247164]1 \n \n \n oc中的方法本质上是一个带有id self和sel_-cmd参数的C方法。\n \n在aObject.a中,a是一个实例方法,那么如何动态绑定类方法呢?通过resolveClassMethod。\n//代码\n导入<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface a:nsObject\n@the end\n@implementation a.\nvoid b(id self,sel _cmd)\nnslog(@“b”);\n \nsel+(bool)resolveClassMethod:(sel)\n类addMethod([self class],@the selector(b),(imp)b,“v@:”);\n返回yes;\n \n@the end\n int main(int argc,char*argv[])\n[[class]a执行选择器:@选择器(b)]。//因为[a b];这种调用方法会导致编译错误,所以动态调用它\n \n \n//中断以查看resolveClassMethod,这仍然是一个崩溃\n017-01-09 22:26:58.671块[34171:285065]+[a b]:根据项目发送到类0x1037B5E30的无法识别的选择器\n \n在超链接中,在类中只找到实例方法,在元类中只找到类方法,相应的调用也一样,即在类中找到实例方法,在元类中找到类方法。因此,将方法B添加到类中并不起任何作用,它只是添加实例方法B。正确的方法如下:\n//code\n import<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface a:nsObject\n@the end\n@implementation a.\nvoid b(id self,sel _cmd)\nnslog(@“b”);\n \nsel+(bool)resolveClassMethod:(sel)\n class ameta=objc_getmetaclass(class_getname([self class]);\nclass_addmethod([ameta class],@the selector(b),(imp)b,“v@:”);\n返回yes;\ n \n@the end\n int main(int argc,char*argv[])\n[[class]a performselector:@the selector(b)].\n \n\n//无崩溃,输出b,无敌\n 2017-01-09 22:31:53.440 B区[34634-289598]\n\niii.邮件转发\n请参阅IMP代码的1。\n//查找IMP \n imp类\u GetMethodImplementation(class cls,sel)\nif(!CLS!sel)返回nil;\nimp imp=lookupimportnil(cls,sel);\nif(!imp)\ncars only//执行动态绑定\n \nimp imp=lookupimportnil(cls,sel);\nif(!imp)return _objc _msgforward;//这是用于消息转发的返回imp。\n \n\n消息转发是objc _msgsend的最后一道防线。如果找不到IMP,将调用以下方法引发异常。\n-(void)doesNotRecognizeSelector(sel)aseSelector;\n\n在方法(例如方法)之前调用doesNotRecognizeSelector。\n-(nsmethodSignature*)methodSignatureForSelector(sel)aseSelector;\n\n如果此方法cr为另一个类的消息创建有效的方法签名(可以在另一个类中有选择器时创建)。创建方法如下:\n-(nsmethodSignature*)methodSignatureForSelector选择器选择器:(sel)\n nsmethodsignature*signature=[super methodSignatureForSelector:选择器];if(!签名)\n b*bobject=[[b alloc]init];//假设在b\n signature=[bobject methodSignatureForSelector:aseSelector]中有一个实例方法aseSelector];\n \n返回签名;\n \n\nDonesNotRecognizeSelector如果签名为nil,则引发异常;如果签名为nil,则执行前向方法。成功。\n-(void)ForwardInvocation:(Aninvocation nsInvocation*)\n b*bobject=[[b alloc]init];\n[Aninvocation'、'29ad2eed42d9dd7a'、'fyynza5l96pcp3trpujkrctbxwtcp',8,'ion invokewithTarget:bobject];\n \n\n当然,在ForwardInvocation中,我们不会调用DoUntrecognizeselec这个类的Tor方法。除非消息返回到自身(如果找不到调用对象的方法,则相应类的doesNoteCongnizeSelector将引发异常)。例如,如果ForwardInvocation不写入任何内容,则不会发生崩溃,也不会引发异常。\n请查看下面完整的示例方法转发代码:\n import<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface b:nsObject\nb-(void);\n@the end \n@implementation b\nb-(void)\nnslog(@“b”);\n \n-(void)doesnotrecognizeselector aseselector:(sel)\n[super doesnotrecognizeselector:aseselector];\n \n@the end \n@interface a:nsObject \n@the end \n@implementation a.\n\n-(nsmethodsignature*)方法签名选择器选择器选择器选择器:(sel)\nnsmethodsignature*签名=[超级方法签名选择器:选择器];if(!签名)\n b*bobject=[[b alloc]init];\n signature=[bobject methodsignatureforselector:aselector];\n \n返回签名;\n \n \n-(void)ForwardInvocation:(Aninvocation nsinvocation*)\nb*bobject=[[b alloc]init];\n[Aninvocation InvokeWithTarget:bobject];\n \n-(void)不Trecognizeselector a selector:(sel)\n[super doesnotrecognizeselector:aseselector];\n \n@the end\n int main(int argc,char*argv[])\n a*aObject=[[a alloc]init]\n[aObject performmselector:@the selector(b)].\n \n\n如果不考虑这种情况(例如方法转发),让我们继续到类方法转发。与实例方法类似,还有两个额外的关注领域。\n\n实例方法在B类中查找B方法,如果查找类方法,则需要查找B的元类。\n上述代码中的方法SignatureForSelector、ForwardInvocation不向前认知Selector在类方法不能被触发时,需要在前面用“+”将被触发(毕竟是要查找类方法,有点不同)。\n\n类方法转发代码如下:\n import<>uikit/uikit。H.N.I.I.I.进口>基础/基础。h \n import\n\n@interface b:nsObject\nb+(void);\n@the end\n@implementation b\nb+(void)\nnslog(@“b”);\n \n-(void)doesnoTrecognizeSelector aseSelector:(sel)\n[super doesnoTrecognizeSelector:aseSelector];\n \n@the end\n@interface a:nsObject\n@the end\n@implementation a.\n\n+(nsmethodSignature*)方法签名选择器选择器选择器选择器:(sel)\nnsmethodsignature*签名=[超级方法签名选择器:选择器];if(!签名)\n类bmeta=objc_getmetaclass(class_getname([b class]);\n signature=[[bmeta class]instancemethodsignatureforselector:aselector];\n \n返回签名;\n \n \n+(void)ForwardInvocation:(invocation nsinvocation*)\n[invocation invokewithTarget:[b class];\n \n+(void)doesnotrecognizeselector a selector:(sel)\n[super doesnotrecognizeselector:aselector];\n \n@the end\n int main(int argc,char*argv[])\n[[class]a performselector:@the selector(b)].\n \n\niv.邮件转发和补充\n1,ForwardingTargetfelector \n不,许多阅读过有关邮件转发的文章的读者可能会发现运行时间3月,objc msgsend前世(2)
蜜小助-恋爱/撩妹聊天必备神器
蜜小助App

内置20W+恋爱聊天话术

一键复制解决尬聊话题

相关推荐
喜欢的女生喜欢白色,要送什么礼物给她 什么是互补型爱情 女生说自己胖了,高情商都这么回复! 女生说自己胖,要怎么高情商回复
热门推荐
1
口述:公公在梳妆台上给我数次高潮
口述:公公在梳妆台上给我数次高潮

我与老公结婚三年了,老公是个特别老实的男人,平时很听我的话,也很疼爱我。我是一个快要30的女人,一个普通的白领,都说这个年纪的女人如狼似虎,一点都没有说错。脱去了20岁懵懂的天真,现在的我对夫妻生活的要求真的越来越多了。老公是一位公司主管,平时工作特别忙,而且经常因为业务需要出差,就是晚上能够按时回来,基本上都觉得一天的工作太累,而我们夫妻之间的亲密事让他有些力不从心。我不得不说,综合各方面来说,...

2
二宮琴美、東熱出操翻白眼昏死
二宮琴美、東熱出操翻白眼昏死

昨天才藉著「白鳥真衣」(宮沢まき)的狀況說明了現在東熱的困境,今天筆者再介紹另一位已經被辨識出身分的「二宮琴美」老調重談,看看東熱近來的餌食有多「菜」吧:她是才剛被發表、演出「鬼逝」的新鮮餌食,所謂的「鬼逝」意思很簡單,就是「把妳幹到死」,所以除了男優演出會格外粗暴外女優也會被搞到「再起不能」,而這...

3
那个午夜 禽兽继父将我压在身下
那个午夜 禽兽继父将我压在身下

我是爸妈的私生女,他们谈恋爱的时候,意外怀孕生下了我。后来,爷爷奶奶死活不同意爸爸娶我妈妈。妈妈说,如果我是个男孩就好了。你要是个男孩,你爷爷肯定不会让你爸爸抛弃我们。最后,爸爸给了妈妈一笔钱,相互拥抱着,哭了一夜,就分开了。妈妈坚持把我生了下来。不久,就听说爸爸和别的女人结婚了。两年以后,妈妈带着我嫁给了一个出租车司机。继父比我妈妈大5岁,很老实,对我不错,就像对自己的亲生女儿一样。当然,他还没...

4
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看

第一次看到韩国美女主播的视频,是两年前在同事电脑上看到的,那是一部朴妮唛的直播视频。当时给我的感觉就是眼前一亮,感觉这身材和脸蛋能够秒杀很多当红明星啊!后来才知道她叫朴妮唛,韩国人。也关注过一段时间,搜集了一些视频,同时了解到韩国有很多像朴妮唛这样的美女主播。后来慢慢的会搜集一些这样的视频,可是基本...

5
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年

店长推荐作品EMP-001EMPIREVol.150波多野结衣50连发泼溅中2012年度亚洲无码最佳A片第一名

6
留守女人和禽兽公公的不伦性事
留守女人和禽兽公公的不伦性事

我结婚一年多了,非常郁闷,整天提心吊胆的,原因是老公刚转成自愿兵未能复员。现如今我和公公两人生活在家,很不习惯,也很为难。其实公公这个人挺好的,只是孤男寡女长期这样子住在一起,不管别人如何评论,自己也总觉得不得劲儿。今年我23岁了,比老公还大1岁。嫁他时就是公公说的媒。公公是我们学校的会计,在这里工作10多年了,口碑蛮不错,是个老好人,我是前年毕业后被派遣到这里来实习的。我家在农村,父母都是老实巴...

最新推荐
吵架先认错感觉没备注
吵架先认错感觉没备注
2023-10-20
男生想要的安全感是什么样的
男生想要的安全感是什么样的
2023-10-16
喜欢的女生喜欢白色,要送什么礼物给她
喜欢的女生喜欢白色,要送什么礼物给她
2023-10-08
什么是互补型爱情
什么是互补型爱情
2023-10-08
女生说自己胖了,高情商都这么回复!
女生说自己胖了,高情商都这么回复!
2023-09-28
女生说自己胖,要怎么高情商回复
女生说自己胖,要怎么高情商回复
2023-09-22
热点推荐