最近作了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 框架了.
編程