最近作了AOP, 监测工程中的某些数据. 可是不能影响原工程, 也不在原工程中写代码; 面向切面编程, AOP.
首先使用了个开源的第三方, Aspects;
关于框架的搭建
第一个版本主要是收集Node中的数据. 以后确定还会收集其余的数据; 主要就是对 WebSocket 中的方法, 插入代码. 因此须要一个管理类, 管理要去收集哪些数据; 在管理类中有一个数组, 其中存放着使用了的对象.这些对象去收集须要的数据; 这些对象可随时添加和移除; 这些对象都有一些公共特征, 因此写成一个公共的基础类(baseObject);
既然是面向切面编程, 不能影响了原代码的效率, 因此须要在本身的线程中处理;
Node数据收集
思路:在WebSocket调用 setDelegate: 的时候, 把delegate 设置成本身的对象, 操做后再转发给原来的对象; 在继承于baseObject的类中, 要去设置新的代理, 并给其余须要关注的方法插入代码. 原本想着使用单例, 这样就能够保证只有一个对象管理WebSocket的有关代码.可是这样用的单例太多, 其实彻底没有必要.(以前为何会用单例, 是由于在管理类中, 要控制Socket 数据收集的开启和关闭, 由于不在一个方法中, 因此不能找到同一个对象, 使用了数组管理, 而且给其加上一个分类type标签, 就能够区分出具体的对象, 由于每种只有一个对象, 因此只须要一个是什么类型的标签就能够);
在hook方法中, 要对多个socket方法进行操做, 每次都要设置代理为A, 怎么能够保证是同一个A? 能够给 socket 添加一个属性, 每次找到的都是同一个A; 给 NSObject 写一个分类, 添加一个属性, 用来存储新的代理对象; 由于若是外界使用了两个 socket 只有一个代理的话, 确定是不对的;
咱们其实没有使用 socket 对象, 只是代理方法中, 引用了 Socket对象, 咱们将代理方法中的socket 改为 id类型, 就没必要依赖 WebSocket 框架了.
编程