AOP iOS中如何實現AOP

2021-08-19 10:32:05 字數 1585 閱讀 1154

aop:aspect oriented programming,譯為面向切面程式設計。

在不修改源**的情況下,通過執行時給程式新增統一功能的技術。

我覺得其中有兩層涵義:

主要功能:日誌記錄,效能統計等。

在ios中實現aop的核心技術是runtime,使用runtimemethod swizzling黑魔法,我們可以移花接木,在執行時將方法的具體實現添油加醋、偷梁換柱。

文章 method swizzling 庫

aspects 和 jrswizzle

aspects

+ (id

)aspect_hookselector

:(sel)selector

withoptions

:(aspectoptions)options

usingblock

:(id)block

error

:(nserror **)error;

- (id)aspect_hookselector:(sel)selector

withoptions:(aspectoptions)options

usingblock:(id)block

error:(nserror **)error;

實際為同乙個方法,這兩個方法是同名不同型別的方法,乙個是靜態類方法,乙個是成員方法。

使用這個方法可以給類的例項方法新增乙個block,並且對這個類的所有物件都會起作用。

所有的呼叫,都會是執行緒安全的。aspects使用了objective-c的訊息**機制,會有一定的效能消耗。所有對於過於頻繁的呼叫,不建議使用aspectsaspects更適用於檢視/控制器相關的等每秒呼叫不超過1000次的**。

在除錯應用時,使用aspects動態新增日誌記錄功能。

aspectinfo) error:null];

[uiviewcontroller aspect_hookselector:nsselectorfromstring(@"dealloc") withoptions:aspectpositionbefore usingblock:^(id

aspectinfo) error:null];

與上一段**的微小差別是selector換成了nsselectorfromstring(@"dealloc"),而不是@selector(dealloc),這是因為在arc下面是不能直接手動呼叫dealloc的,@selector(dealloc)會被編譯器直接報錯。

通過這個log,我們可以知道viewcontroller是否釋放,如果沒有釋放很可能就是有迴圈引用,這時你務必仔細檢查你的**,這在效能除錯和debug中非常有用。

AOP是如何實現的?

spring中的aop 還是離不開spring的ioc容器,的生成,管理及其依賴關係都是由ioc容器負責 spring預設使用jdk動態 在需要 類而不是 介面的時候,spring會自動切換為使用cglib 不過現在的專案都是面向介面程式設計,所以jdk動態 相對來說用的還是多一些。類實現invoc...

Spring中的AOP實現

aop是乙個面像切點,比如,如果寫好乙個專案後,想要繼續給其新增功能,按照以前的寫法就需要更該以前所寫好的 而aop就是把這一項缺陷所彌補 並aop面像切點只可在spring中使用 beans 3,建立好幾個測試用的類,乙個所需要插入的類,乙個提供插入的類 還有測試類,並實現裡面的方法 4,在aop...

註解實現AOP

使用註解實現aop,注意版本問題,使用註解報錯要匯入m en依賴 dependency groupid j ax.annotation groupid artifactid j ax.annotation api artifactid version 1.3.2 version dependency...