前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS的动态创建实例方法和实现消息转发

iOS的动态创建实例方法和实现消息转发

原创
作者头像
conanma
修改2021-06-08 18:15:05
5720
修改2021-06-08 18:15:05
举报
文章被收录于专栏:正则正则

做了几年的iOS开发一直没有写博客,一直怕写的不好误导大家,今儿第一次在腾讯云写点干货

实现动态添加方法

(1)为了编译通过,我们需要通过performSelector开头的方法调用 TestTransmit这个类的方法show:)的方法

(2)如果TestTransmit类没有实现show:方法那么将调用TestTransmit的类方法+(void)resolveInstanceMethod:方法,覆盖这个方法

判断一下要调用的方法时候和我在这个类里想调用的方法时候一致,if(一致)用class_addMethod这个c语言函数创建一个方法,这个方法的第一个参数就是你要添加方法的那个类的class类对象,第二个参数就是传递过来的sel,第三个是一个函数的入口名称,这个函数实际上是内部内容就是添加方法的内部内容,第四个参数是上一个参数--函数的参数要数,第一个v代表这个函数的返回值为void,如果返回对象类型就是@,后面的@:@分别代表后续的三个参数,其中Sel类型的用:表示,具体请参考苹果开发文档。其实除了_cmd大家可能不熟悉之外,其他的基本上可以参考NSLog这个函数了,NSString就是用@表示。

别忘了调用super方法,至于调用class后一行需要返回一个bool值,据验证,无论返回NO还是YES,dynamic_show函数都会被调用。

实现消息转发

接着上面的代码写,如果我把上面的class_addMethod函数调用这一行注释掉程序立马crash,如果想程序不蹦,那么就需要接着询问消息改怎么处理,很显然当前类是没有没有办法接着寻找这个方法了,那么我们就需要转给其他类来处理,就需要实现methodSignatureForSelector:这个方法了这个类告诉我们时候有处理这个消息的类,如果返回不为空,那么就来到这个方法forwardInvocation:这个方法怎么处理我就不多说,直接上图

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档