ios-面试

ios-面试-runtime中黑魔法方法交换

2019-12-09  本文已影响0人  简鱼7819

方法交换-原理

方法交换,传言中的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:方法。

load 交换的方法

2,UItableview中cell点击

按钮button点击和viewcontroller生命周期监听就不说了,太广泛了,基本上都用到过。

load方法

处理UItableview的delegate,点击事件交换

判断sel是否被实现,free手动释放

点击事件中回到UItableview中原方法,IMP、SEL

UItableview点击事件是这样监听,UICollectionView的实现类似。

3,UIGestureRecognizer的点击事件处理

UIGestureRecognizer有点特殊,它需要添加一个methodName属性,这个属性用来储存selector中的方法名。

核心代码如下

这样就能拿到UIGestureRecognizer触发的事件了。

梳理,记录,分享~~

喜欢的点赞,大神有指点的请留言!!

上一篇下一篇

猜你喜欢

热点阅读