做了几年的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:这个方法怎么处理我就不多说,直接上图