看淘网-高情商聊天恋爱宝典!| 下载蜜小助-恋爱聊天话术

当前位置: 首页> 文章

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

发布时间:2019-08-13 16:32:39 作者:xhs 阅读:755
运行时间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)
相关文章
猜您喜欢
怎么试探前女友想不想复合?

女人是一种让男人捉摸不透的生物,特别是在分手后,就算有复合的想法,表面也会表现的很平静。所以需要男人根据情况自己判断。那到底该怎么去试探前女友想不想复合呢?

2024-02-21

狮子座女生的10个特点,追她之前摸透她的心

狮子座女生可不是那么好追的女生,看上去她平易近人、热情开朗,其实内心却有着自己的小傲娇,狮子座女生的10个特点,追她之前先了解一下吧!

2024-02-21

大街上怎么要女生微信不尴尬,这样要女生乖乖给你

很多时候男生就算在大街上遇到自己喜欢的女生类型,也不敢上来问女生微信,只能看着自己心仪的女生慢慢走远。下面给大家分享大街上怎么要女生微信不尴尬,这样要女生乖乖给你。

2024-02-20

用一个问题测试她喜欢你的方法,女生喜欢你就去追

想知道女生是不是喜欢你,教用一个问题测试她喜欢你的方法:你可以对她说一句话:你好像长胖了一点?(看看女生是什么反应。不过如果男生问出这个问题,可能让女生觉得你情商低,就算女生喜欢你也有一定的风险性)

2024-02-20

女生说心累怎么回复安慰她?分享正确回复方法

女生会在什么情况下说心累呢?可能是她工作上面遇到问题不好解决,让她觉得心累;可能是你对于女生的暗示无动于衷,女生觉得你不落教感到心累。那女生说心累应该怎么回复安慰她呢?

2024-02-19

惹女朋友生气检讨书1000字,哄她不再生你的气

如果男生犯了错惹女朋友生气,那就一定要想办法哄好她,因为是你错了呀。而想要哄好生气的女朋友,那你一定要认识到自己的错误,下面给大家分享惹女朋友生气检讨书1000字,希望能够帮助你哄好你的女朋友。

2024-02-19

婚姻恢复——维持感情让家庭重归平静

婚姻中有幸福的时候,也有不幸福的时候,夫妻应该做到维持好感情,才能顺利让婚姻恢复到幸福的时候,让家庭重归平静。

2024-02-19

怎么追巨蟹座女生?追巨蟹座女生怎么聊天

和巨蟹座女生谈过恋爱之后,就会知道她的内心真的很纯真,不过她性格上的复杂性则是让许多男生疑惑的关键,怎么追巨蟹座女生?追巨蟹座女生的时候要如何聊天呢?

2024-02-18

女朋友说分手后做朋友是什么意思?是真的做朋友么

如果女朋友说分手后做朋友是什么意思呢?如果是还爱着对方那就不应该选择分手,如果是不爱了那大家就应该彻底断了联系,真正深爱过的人是不可能在分手后做朋友的。下面就来分析女朋友的心理。

2024-02-18

暗恋一个人能有多难受?虐心回答句句戳心

暗恋是幸福的,却又是痛苦的,更是难受的,可遇而不可求的爱始终会令人感到绝望,那就是暗恋一个人所体会的难受,明明没有机会却又不想放手真的很痛苦。

2024-02-18

脱单神器
脱单神器
安卓版蜜小助APP 脱单神器
iOS版蜜小助APP 脱单神器

20W+可复制撩妹话术

实战案例+话术+视频+教程

热门文章
口述:公公在梳妆台上给我数次高潮
口述:公公在梳妆台上给我数次高潮
2013-11-11 1069065
二宮琴美、東熱出操翻白眼昏死
二宮琴美、東熱出操翻白眼昏死
2015-03-14 78328
那个午夜 禽兽继父将我压在身下
那个午夜 禽兽继父将我压在身下
2014-04-08 78054
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看
韩国美女主播”钟淑”高清视频精品合集9部 115网盘在线观看
2015-03-11 77288
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年
店长推荐作品 EMP-001 EMPIRE Vol.1 50 波多野结衣 50连发泼溅中 2012年
2015-03-19 75774
留守女人和禽兽公公的不伦性事
留守女人和禽兽公公的不伦性事
2013-12-28 74937
美国男人让我一夜高潮五次
美国男人让我一夜高潮五次
2014-04-29 69845
关牧村与前夫王星军离婚真正原因 关牧村前夫王星军照片家庭背景及个人资料
关牧村与前夫王星军离婚真正原因 关牧村前夫王星军照片家庭背景及个人资料
2014-08-15 64941
公公的精湛床技让我死去活来
公公的精湛床技让我死去活来
2014-04-08 56763
我和小姨子在车上疯狂嘿咻
我和小姨子在车上疯狂嘿咻
2013-12-28 56566