美文网首页ios-面试
ios-面试-runtime中黑魔法方法交换

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

作者: 简鱼7819 | 来源:发表于2019-12-09 18:27 被阅读0次

    方法交换-原理

    方法交换,传言中的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触发的事件了。

    梳理,记录,分享~~

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

    相关文章

      网友评论

        本文标题:ios-面试-runtime中黑魔法方法交换

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