Swizzling 偷梁換柱的黑魔法!

2021-07-24 04:09:50 字數 1884 閱讀 1299

我們知道,oc是一門動態執行時語言。我們也知道,oc中的函式呼叫本質上其實是訊息的傳送:objc_msgsend(someobject, @selector(methodname), parameters)所有要呼叫的函式,編譯階段是無法確定的,只有到執行的時候才能確定!正因為有此特性,所以在執行階段,我們都還可以做很多事,而要把本來應該實現的方法a,偷偷換成方法b,便是其中的一種,這種技術叫做:method swizzling(方法交換)!

具體相關的概念就不再囉嗦了,網上都有很多了,可以自行google或者查閱《effective objective-c 2.0 編寫高質量ios與os x **的52個有效方法》的第13條,介紹的都比較詳細了。這裡就總結一下相關的應用!

除錯用假如每次呼叫nsstring的lowercasestring方法時,不要每次都去nslog,希望直接呼叫系統的方法時每次都可以輸出log,那麼這時候就可以用到該技術:

@inte***ce

nsstring (xppmyadditions)

- (nsstring *)xpp_mylowercasestring;

@end

@implementation

nsstring (xppmyadditions)

- (nsstring *)xpp_mylowercasestring

接下來做的就是把這個分類裡面的方法和原生的方法交換一下:

void swizzling()
那麼在以後,直接呼叫系統原生的lowercasestring方法時,實際上呼叫的是分類裡面的方法,在達到原來目的的同時,還能輸出結果,非常方便!

注意:交換過後呼叫nsstring原生的lowercasestring實際上是呼叫xpp_mylowercasestring;而在現在的xpp_mylowercasestring裡面,其實[self xpp_mylowercasestring]實際上是呼叫了系統的lowercasestring方法達到把字串變為小寫的目的。所以,不會陷入死迴圈!

一次性更改

@inte***ce

uifont (xppmyadditions)

+ (uifont *)xpp_systemfontofsize:(cgfloat)size;

@end

@implementation

uifont (xppmyadditions)

+ (uifont *)xpp_systemfontofsize:(cgfloat)size

接下來,再把系統的方法和該方法交換一下:

method

m1 = class_getclassmethod

([uifont class], @selector(systemfontofsize:));

method

m2 = class_getclassmethod

([uifont class], @selector(xpp_systemfontofsize:));

method_exchangeimplementations(m1, m2);

注意:這裡是類方法!不是例項方法,所以注意api的呼叫和分類方法要匹配,否則不會報錯,但是你會發現沒效果

誒,這時候就太方便了,隨便你想加2個點還是減1個點,無所謂,乙個數字的事兒。

所以,從上看出,方法交換技術還是作用挺大的。只是盡量還是少用,一般就用來除錯或者做些需要大量改動的處理。一般**中不要為了show技術胡亂使用,這樣會導致**結構太差,用的多了,**可讀性也變差了,所以盡量還是少用,要不然哪天出bug了你都不知道問題在哪兒。合理使用即可!

LD PRELOAD的偷梁換柱之能

原創 本文 發布日期 2015 年 06月 22日 ld preload是linux系統的乙個環境變數,它可以影響程式的執行時的鏈結 runtime linker 它允許你定義在程式執行前優先載入的動態鏈結庫。這個功能主要就是用來有選擇性的載入不同動態鏈結庫中的相同函式。通過這個環境變數,我們可以在...

黑與不黑的區別

最近聽到訊息聽說微軟要黑屏計畫,思量半天,竟得不出個所以然。微軟宣布要從下週一起對盜版xp進行強制黑屏驗證沒過多久,網上就冒出了多個破解黑屏的辦法。除了建議盜版使用者選擇關閉更新外,還有公布了刪除驗證項的辦法。大多數使用盜版xp的對微軟的這個強制驗證辦法感到是 小菜一碟 一位說,微軟此舉可歸為常規性...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...