iOS实例方法声明了没有实现该如何解决

来源:互联网 发布:surge for mac官网 编辑:程序博客网 时间:2024/05/16 09:53

昨天去乐视面试,被大牛问了这个问题,好久没用过这个方法了 ,回来自己敲了下代码,记录下来同时也分享给大家
+ 代表方法为 类方法;
 - 代表方法为 实例方法;
问题就是在一个类中有一个实例方法,在.h文件中声明了,可是.m文件中没有实现,这样写虽然编译器不会报错
可是如果在一个类中调用了这个实例方法,就会报错,要如何解决


这时候运行时的作用就又体现出来了,我们要用

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

实现动态添加方法

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


(2)如果 HMPerson类没有实现showTime:方法那么将调用 HMPerson的类方法+(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:



0 0
原创粉丝点击