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:
- iOS实例方法声明了没有实现该如何解决
- 最新的swift 没有了fromraw方法,该如何获取初始值为x的枚举值
- 如何解决AlertDialog.Builder没有dismiss()方法
- 让人寒透了心的APP盗版问题,该如何解决
- 电脑文件被破损了该如何解决
- dedecms后台管理员密码忘记了该如何解决
- 是不是程序员总会遇到一个瓶颈期,觉得自己没有进步了,该怎么解决?
- 程序员总会遇到一个瓶颈期,觉得自己没有进步了,该怎么解决?
- sql 存储过程中 如何使用declare 有的存储过程声明了,有的没有声明。请回答的详细点
- j2ee实现循环更新表功能,该如何解决
- eclipse导入了一个java项目,发现其中没有jre system library,该如何添加
- smarty中,如果改变模板,刷新页面没有变化,该如何解决?
- iOS 中可变参数方法的声明和实现
- iOS —— 多参数方法的声明与实现
- iOS之04-方法的声明和实现
- IOS Button title居中实现方法实例
- WAF该如何实现?
- 工作了 该如何生活
- 进程与线程
- Spring Bean 生命周期
- SMBUS的介绍与访问
- async 和 await
- C# Form1隐藏,在Form2关闭时显示Form1
- iOS实例方法声明了没有实现该如何解决
- ==和equals
- 启动线程以及线程安全
- 牛顿迭代法解非线性方程组
- 02,预处理指令
- qxdm 激活
- JQuery选择器大全
- Formatter格式化文本
- 事件冒泡 默认事件