方法交换-原理
方法交换,传言中的runtime中的黑魔法!
依据runtime的机制,OC中类生成的对象在运行时会(绑定或者加载)其所具有的方法和属性,这些方法或者属性支持在运行时动态生成。so!具体到代码机制实现上,就是动态操作了类生成对象中的方法列表。类isa的分析
方法列表objc_method_list维护了一张selector和imp的映射表,runtime提供的api中有能够操作这种映射的,所以黑魔法就出现了。
具体代码做法:
1,找到你要做方法交换的类,创建该类的分类
2,在分类中load类方法中做方法交换
3,load做交换时,最好加入dispatch_once控制该代码只被执行一次
方法交换-使用场景
目前应用场景:
1,做Aop切面监听的产品,“无埋点”信息采集;
2,App开发中做防奔溃处理,比如数据越界,字典参数值nil等
方法交换-代码
这些点自己尝试写过或者已经做过,就不在主要的注意点了,重要是知道这个东西实现原理。面试过程被询问的时候,能够很清晰地表达出来。
不过不贴代码的话,说这些有点耍流氓,下面贴一些主流的HOOK无埋点信息采集方面的代码。
黑魔法工具类实现
1,屏幕点击
监控屏幕点击,包括屏幕点击的位置(x,y),点击时接触面积size,点击时type,点击时间。
根据需要我们hook的类为UIApplication中的sendEvent:方法。
2,UItableview中cell点击
按钮button点击和viewcontroller生命周期监听就不说了,太广泛了,基本上都用到过。
load方法
处理UItableview的delegate,点击事件交换
判断sel是否被实现,free手动释放
点击事件中回到UItableview中原方法,IMP、SEL
UItableview点击事件是这样监听,UICollectionView的实现类似。
3,UIGestureRecognizer的点击事件处理
UIGestureRecognizer有点特殊,它需要添加一个methodName属性,这个属性用来储存selector中的方法名。
核心代码如下
这样就能拿到UIGestureRecognizer触发的事件了。
梳理,记录,分享~~
喜欢的点赞,大神有指点的请留言!!