iOS Swizzle method

在理解這一套東西之前,我們先理清楚幾個函數(shù)的意義

1.?class_addMethod(aClass, originalSel, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod))

????????這個函數(shù)的意義是丘薛,給一個類aClass,添加一個SEL originalSel切油, 如果該類已經(jīng)實現(xiàn)了originalSel,則添加失敗,返回NO

????????哪怕aClass 的父類實現(xiàn)了originalSel,也會返回NO

? ??????swizzleMethod必須是實現(xiàn)了的IMP,否則會crash

? ? ? ? 常見用法:

? ? ? ?1. 給類未實現(xiàn)的SEL钞馁,改變IMP

? ? ? ? 2. 檢查本類是否實現(xiàn)了某個方法(使用method_exchangeImplementations時,添加該檢測匿刮,避免影響父類)

? ? ? ? 我們來看一個簡單的例子僧凰,自己踩過的坑,覺得很low 的請自行略過熟丸,大致代碼邏輯如下

? ? ? ? ClassA : NSObejct -> 有一個func works()

? ? ? ? ClassB : NSObject -> 有一個func bWorks()

? ? ? ? 在 ClassB的load 中训措,添加method_exchangeImplementations(work,bwork)

? ? ? ? 按照我以前的想法,ClassB中 交換了work 和bWork, 這對A不會有什么影響光羞,所以绩鸣,A在調(diào)用work()時,應(yīng)該是work()的實現(xiàn)

? ? ? ? 然而纱兑, 結(jié)果是a 調(diào)用work()時呀闻,內(nèi)容是bWork()的實現(xiàn),why?

? ? ? ? 這是因為

ClassA do load -> ClassB do load -> exchange works() bWorks()實現(xiàn) ->

b 中找不到works() 的SEL潜慎, 往父親找总珠,找到了 -> 交換父親的works() SEL 與 bWorks() 的SEL

? ? ? 這顯然不是我們想要的結(jié)果,一般情況下我們的目的只是影響本類或者子類勘纯,而不想影響父類局服,那么怎么辦呢

2.?class_replaceMethod(aClass, swizzleSel, originalMethodIMP, originalMethodEncodeing)

? ? ? ? 用一個SEL 替換另外一個IMP實現(xiàn)

????????aClass ? : 將要操作的類

? ??????swizzleSel : 用于替換的SEL

? ? ? ??originalMethodIMP : 被替換的IMP

????????originalMethodEncodeing? ?: 被替換的IMPEncodeing

3. method_exchangeImplementations(originalMethod, swizzleMethod)?

????????交換兩個method

? ? ? ? 我們接著說第一個方法中的case,怎么辦呢驳遵,我們可以這樣

? ??????

? ? 子類中淫奔,發(fā)現(xiàn)本類沒有實現(xiàn)的method(可能父類實現(xiàn)了),直接替換methodIMP

? ? 如果是本類實現(xiàn)的method堤结,再交換method

case1 : 子類沒有實現(xiàn)父類的方法

ClassA do load -> ClassB do load -> Classb 中唆迁,bWorks() 替換了works() 方法?

-> a call works() -> a 就調(diào)用a 的works()

case2 : 子類實現(xiàn)了父類的方法

ClassA do load -> ClassB do load -> exchange 類B中 works() bWorks() IMP

-> a call works() -> a 的works() 的IMP 沒有改變,所以還是ClassA中works() 的實現(xiàn)


Swizzle 用途:

1. 頁面統(tǒng)計竞穷,比如ViewController 中唐责,添加category, 在category 中使用Swizzle瘾带, 統(tǒng)計頁面

2. 對系統(tǒng)類的一些方法鼠哥,提供改善,比如 NSArray,NSMutableArray朴恳,NSDictionary抄罕,NSMutableDictionary

,Xcode 10 以前于颖,數(shù)組越界呆贿,插入nil 會crash,可以對對應(yīng)的方法加hook森渐,使不crash做入,Xcode 10 以后盡管不會crash了,但是還是可以對系統(tǒng)的方法進行我們需要的改善

? ? ? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末同衣,一起剝皮案震驚了整個濱河市母蛛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乳怎,老刑警劉巖彩郊,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚪缀,居然都是意外死亡秫逝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門询枚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來违帆,“玉大人,你說我怎么就攤上這事金蜀∷⒑螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵渊抄,是天一觀的道長尝胆。 經(jīng)常有香客問我,道長护桦,這世上最難降的妖魔是什么含衔? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮二庵,結(jié)果婚禮上贪染,老公的妹妹穿的比我還像新娘。我一直安慰自己催享,他們只是感情好杭隙,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著因妙,像睡著了一般痰憎。 火紅的嫁衣襯著肌膚如雪票髓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天信殊,我揣著相機與錄音炬称,去河邊找鬼汁果。 笑死涡拘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的据德。 我是一名探鬼主播鳄乏,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棘利!你這毒婦竟也來了橱野?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤善玫,失蹤者是張志新(化名)和其女友劉穎水援,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茅郎,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蜗元,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了系冗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕扣。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掌敬,靈堂內(nèi)的尸體忽然破棺而出惯豆,到底是詐尸還是另有隱情,我是刑警寧澤奔害,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布楷兽,位于F島的核電站,受9級特大地震影響华临,放射性物質(zhì)發(fā)生泄漏拄养。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一银舱、第九天 我趴在偏房一處隱蔽的房頂上張望瘪匿。 院中可真熱鬧,春花似錦寻馏、人聲如沸棋弥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顽染。三九已至漾岳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粉寞,已是汗流浹背尼荆。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唧垦,地道東北人捅儒。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像振亮,于是被迫代替她去往敵國和親巧还。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 我們常常會聽說 Objective-C 是一門動態(tài)語言坊秸,那么這個「動態(tài)」表現(xiàn)在哪呢麸祷?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,176評論 0 7
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 748評論 0 1
  • 1.實例方法交換 2.類方法交換 3.class一點總結(jié) 項目地址:https://github.com/hkkh...
    鄙人哈哈哈哈5871閱讀 2,353評論 0 6
  • 本文詳細整理了 Cocoa 的 Runtime 系統(tǒng)的知識,它使得 Objective-C 如虎添翼褒搔,具備了靈活的...
    lylaut閱讀 792評論 0 4
  • 繼上Runtime梳理(四) 通過前面的學(xué)習(xí)阶牍,我們了解到Objective-C的動態(tài)特性:Objective-C不...
    小名一峰閱讀 741評論 0 3