美文网首页
Hook-的策略

Hook-的策略

作者: 9362d9acd9ef | 来源:发表于2017-11-26 19:46 被阅读32次

想要替换整个项目里面所有 class 自己感兴趣的方法(layoutSubviews;cellForRow;viewDidLoad)以便统计方法调用时长

迭代 1.0

  • 启动以后拿到所有 class
  • 生成一棵以 NSObject 为根节点的继承树
  • 在树中找到 UIView 这个节点,向下递归遍历 Swizzle 所有节点我们想要 hook 的方法(layoutSubviews 等)
  • 在树中找到 UIViewController 这个节点,向下递归遍历 Swizzle 所有节点我们想要 hook 的方法(viewDidLoad 等)

生成树的过程太慢。 App 启动以后直接 CPU 跑满卡死。(这东西直接跑在项目里面估计要被同事们打死的)

迭代 1.1

不放在主线程跑,异步去跑,效果还是不太能接受。

迭代 2.0

把 Hook 阶段进行拆分。

  1. 先 Hook 基类
  2. 当基类的方法被调用时去判断当前对象是否已经被 Hook。如果没有就去 hook

一、Hook 基类
我们只 Hook 一些基类的方法

  • UIView : layoutSubviews
  • UIViewContoller : viewDidLoad

二、动态 Hook

这一步执行时必须保证第二步已经完成

当基类的方法被调用的时候需要执行的逻辑

  1. 根据调用对象的 Class 和 SEL 拼接字符串
  2. 通过字符串判断是否已经 Hook
  3. Hook if needed

举个例子:
我们启动的时候只 Hook UIViewContollerviewDidLoad
viewDidLoad 方法检查这个实例是否被 hook。如果没有就 hook 一次。

缺点 hook以后只能等下一次调用才会起作用。需要先进这个 VC 去触发一次 hook 的行为,然后退退出,下次再进来才能有数据。

迭代 2.1

写 Category ,在 + (void)initialize 把这个 class 加入一个缓存数组里。
在合适的时候异步 hook 缓存数组中所有 class。

相关文章

  • Hook-的策略

    想要替换整个项目里面所有 class 自己感兴趣的方法(layoutSubviews;cellForRow;vie...

  • hook-拖拽

    两个是完全不能借鉴对方的思路 1 .如果vue强行用react这种写法的话,出来的效果是很卡顿的。 1 .vue版本

  • Hook-移动办公

    这里给出核心的hook代码,具体见

  • 插件知多少-DIP插件流程

    在PBCA中包含SMT及DIP插件两个程序,SMT在上一篇文章中<帮PCB工厂唱Hook-浅谈SMT表面安装>已详...

  • 插件化—Hook-代理

    1.什么是Hook? hook英文翻译为钩子。简单来说,hook技术就是劫持应用程序本要执行的对象或者方法,将其替...

  • 自定义hook-副作用

    简介 1 .自定义Hook更像是一种约定,而不是一种功能。如果函数以use开头,并且调用了其他的hook,那么就可...

  • 自定义Hook-组件状态

    强制重新渲染界面 1 .代码 2 .使用 获取dom属性 同步到本地存储 获取上一次的props,state 获取...

  • 自定义hook-事件处理

    useChange 1 .绑定表单,创建一个存储变量的数据仓库,暴露出一这个属性和操作这个属性的方法,让别的实例使...

  • hook-模拟生命周期函数

    1 .组件生命周期操作依赖于useEffect hook 模拟componentDidMount 1 .如果需要在...

  • 学生学习策略

    学生学习大策略。 考试的策略,记忆的策略,记单词的策略,预习听课作业策略,各科学习的策略。 复习的策略,阅读的策略...

网友评论

      本文标题:Hook-的策略

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