標籤:objective-c aop runtime 訊息轉寄
Objective-C 下的 AOP 編程概念
在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,是函數式編程的一種衍生範型。通過先行編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。主要的功能是:日誌記錄,效能統計,安全控制,交易處理,異常處理等等。主要的意圖是:將日誌記錄,效能統計,安全控制,交易處理,異常處理等代碼從商務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導商務邏輯的方法中,進而改變這些行為的時候不影響商務邏輯的代碼。
表現
在funa方法前後加執行代碼
[[XYAOP sharedInstance] interceptClass:[Test class] beforeExecutingSelector:@selector(funa) usingBlock:^(NSInvocation *invocation) { NSLog(@"funa before"); }];[[XYAOP sharedInstance] interceptClass:[Test class] afterExecutingSelector:@selector(funa) usingBlock:^(NSInvocation *invocation) { NSLog(@"funa after"); }];
當我們執行funa的時候呢,輸出如下結果
2014-10-28 17:31:01.435 testaop[7609:290860] funa before2014-10-28 17:31:01.436 testaop[7609:290860] funa run2014-10-28 17:31:01.436 testaop[7609:290860] funa after
實現原理
用Objective-C強大的runtime.
我們知道當給一個對象發送一個方法的時候, 如果當前類和父類都沒實現該方法的時候就會走轉寄流程
- 動態方法解析 -> 快速訊息轉寄 -> 標準訊息轉寄
迷茫的同學請搜 "Objective-C 訊息轉寄".
瞭解了訊息轉寄,那麼我們aop的思路就來了,我們是先幹掉原本的方法funa,這樣當給對象發送方法的時候就會走轉寄流程,我們再hook了對象的快速訊息轉寄方法,把實現funa的對象指成我們的aop對象, 最後在aop對象的標準訊息轉寄裡執行before instead after方法.
具體的代碼歡迎大夥去github下載, 記得給咱點個star
https://github.com/uxyheaven/XYQuickDevelop
在代碼裡搜 XYAOP.h
相關一些方法介紹
介紹一些用到的runtime方法
// 給 cls 添加一個新方法BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types);// 替換 cls 裡的一個方法的實現IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types);// 返回 cls 的指定方法Method class_getInstanceMethod ( Class cls, SEL name);// 設定一個方法的實現IMP method_setImplementation ( Method m, IMP imp);// 返回 cls 裡的 name 方法的實現IMP class_getMethodImplementation ( Class cls, SEL name);
Objective-C 下的 AOP 編程