iOS 黑魔法-Method Swizzling

原理:

在Objective-C中調(diào)用一個(gè)方法,其實(shí)是向一個(gè)對(duì)象發(fā)送消息,查找消息的唯一依據(jù)是selector的名字。利用Objective-C的動(dòng)態(tài)特性,可以實(shí)現(xiàn)在運(yùn)行時(shí)偷換selector對(duì)應(yīng)的方法實(shí)現(xiàn),達(dá)到給方法掛鉤的目的。

每個(gè)類都有一個(gè)方法列表,存放著selector的名字和方法實(shí)現(xiàn)的映射關(guān)系。IMP有點(diǎn)類似函數(shù)指針,指向具體的Method實(shí)現(xiàn)。

我們可以利用 method_exchangeImplementations 來(lái)交換2個(gè)方法中的IMP。


例:

重寫NSUserDefaults的讀寫方法,將原來(lái)的(setObject:forKey:)方法,替換成自定義的方法,如(cySwizzlingSetObject:forKey:)

然后交換自定義方法和系統(tǒng)方法,如下:

```

Method?originalMethod?=?class_getInstanceMethod([NSUserDefaults?class],??@selector(setObject:forKey:));??

Method cySwizzledMethod?=?class_getInstanceMethod([NSUserDefaults?class],?@selector(cySwizzleSetObject:forKey:));??

?method_exchangeImplementations(originalMethod, cySwizzledMethod);?

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,030評(píng)論 0 9
  • 剛開(kāi)始學(xué)習(xí)IOS的時(shí)候,聽(tīng)說(shuō)黑魔法很強(qiáng)大,正如它的名字一樣,可以做很多不可思議的事情,一直到今天才徹底靜下心去了解...
    東了個(gè)尼閱讀 1,823評(píng)論 0 3
  • 場(chǎng)景需求:在沒(méi)有一個(gè)類的實(shí)現(xiàn)源碼的情況下,想改變其中一個(gè)方法(一般指系統(tǒng)的方法)的實(shí)現(xiàn),除了繼承它重寫、和借助類別...
    船長(zhǎng)_閱讀 2,200評(píng)論 0 17
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20161102/17920.html 因?yàn)镺b...
    F麥子閱讀 699評(píng)論 0 1
  • 前言: 今天我們?cè)賮?lái)了解另外一個(gè)體現(xiàn)OC動(dòng)態(tài)特性的技術(shù),向來(lái)有IOS黑魔法之稱的Method Swizzling,...
    cxlhaha閱讀 772評(píng)論 0 3

友情鏈接更多精彩內(nèi)容