本文只介绍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秒,这样工程里面其他的代码同样不需要修改,需求就已经完成了。当然了这只是个通配,具体的间隔时间还需要大家添加。
网友评论