美文网首页
Runtime的使用一:交换方法,扩展属性

Runtime的使用一:交换方法,扩展属性

作者: 项啊丑 | 来源:发表于2018-11-13 10:19 被阅读0次

    本文只介绍runtime的作用,以及如何使用,不涉及底层原理。

    说实话,我大概花了2天左右研究了runtime的原理和底层机制,虽然理清了基础,但是要我讲解出来我觉得就有点误人子弟了,而且枯燥无味,没准大家看了想睡觉,所以这次就不说了,以后等我runtime满级了再来跟大家分享

    废话不多说,上干活:

    第一个作用:交换方法

    有人说可能不理解什么是“交换方法”?也有些人则觉得交换方法有啥用?

    这里我就跟大家解释下:

    因为系统的方法我们无法进行拦截和监控,这就导致我们调用系统的方法的时候并不知道它是否调用了,也不知道调用的具体情况。但是呢我的需求是每次我调用各种系统api时,在这个方法执行前我要拦截他,要给他加一个打印日志或者其他的事件。

    打个比方,我项目中的button点击事件,每次点击我都要打印一下,我点击了什么button。这时候有人就说了,我在方法的事件中加一个NSLog不就行了!没错,这个是可以,假如我的项目中有10000个button,每个button我都要打印,这时候你怎么办?

    这时候runtime的好处就体现出来了,runtime能不修改你工程中所有button的代码而直接实现这一功能

    怎么实现呢?!这就涉及到方法的交换了

    首先我们创建一个分类叫limit,UIButton是继承UIControl的,我们直接创建UIControl的分类

    首选我们需要导入runtime的控件

    然后就是要进行方法的交换了

    这就是方法交换的全部代码了,是不是很简洁!你的controller跟view里面甚至都不需要改动一行代码,更令人惊讶的是这个分类的头文件你甚至都不需要导入。runtime是不是很神奇,它就是这么不可思议!

    接下来,我们进阶一下!

    有时候有些用户会疯狂点击我们app的按钮,1秒点个好几次,这时候我们需要加一个限制条件,1秒中只允许点击一次。这个需求如何实现呢?也是一样的操作,不过多了一步,就是对分类进行属性扩展。

    我们创建两个属性

    用来监测点击事件

    这里光创建属性还是不行的,分类里面我们需要自己实现set get方法,如何实现呢,也是用到了runtime

    这就是重写分类属性的全部代码了

    接下来就是我们自定义的点击事件的升级了

    这里我们给点击事件增加了时间的判断,只允许1s只能点击一次,否则会忽略掉此次事件。为了更加快捷,我这里还默认了间隔时间为1秒,这样工程里面其他的代码同样不需要修改,需求就已经完成了。当然了这只是个通配,具体的间隔时间还需要大家添加。

    demo1

    demo2

    相关文章

      网友评论

          本文标题:Runtime的使用一:交换方法,扩展属性

          本文链接:https://www.haomeiwen.com/subject/nsycfqtx.html