您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶(hù)?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

使用Method Swizzling遇到的問(wèn)題和項(xiàng)目中使用的Swizzling方案

大?。?/span>0.2 MB 人氣: 2017-09-22 需要積分:1

  導(dǎo)語(yǔ):Method Swizzling是Objective-C中運(yùn)行時(shí)中討論較多的內(nèi)容,本文主要介紹使用Method Swizzling遇到的問(wèn)題和項(xiàng)目中使用的Swizzling方案。

  一、Method Swizzling簡(jiǎn)介

  Method Swizzling的本質(zhì)是在運(yùn)行時(shí)交換方法實(shí)現(xiàn)(IMP),如hook系統(tǒng)方法,在原有的方法中,插入自己的業(yè)務(wù)需求。

  1、Method Swizzling原理

  Objective-C的消息機(jī)制:在 Objective-C 中調(diào)用一個(gè)方法, 實(shí)際上是在底層通過(guò) objc_msgSend()發(fā)送一個(gè)消息。 而查找消息的唯一依據(jù)是selector的方法名。

  //調(diào)用方法 [obj doSomething]; //[obj doSomething]本質(zhì)上是給obj發(fā)doSomething消息 objc_msgSend(obj,@selector(doSomething))

  每一個(gè)OC實(shí)例對(duì)象都保存有isa指針和實(shí)例變量,其中isa指針?biāo)鶎兕?lèi),類(lèi)維護(hù)一個(gè)運(yùn)行時(shí)可接收的方法列表(MethodLists);方法列表(MethodLists)中保存selector的方法名和方法實(shí)現(xiàn)(IMP,指向Method實(shí)現(xiàn)的指針)的映射關(guān)系。在運(yùn)行時(shí),通過(guò)selecter找到匹配的IMP,從而找到的具體的實(shí)現(xiàn)函數(shù)。

  使用Method Swizzling遇到的問(wèn)題和項(xiàng)目中使用的Swizzling方案

  MethodLists示意圖.png

  開(kāi)發(fā)中可以利用Objective-C的動(dòng)態(tài)特性,在運(yùn)行時(shí)替換selector對(duì)應(yīng)的方法實(shí)現(xiàn)(IMP),達(dá)到給hook的目的。下圖是利用Method Swizzling來(lái)替換selector對(duì)應(yīng)IMP后的方法列表示意圖。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶(hù)評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?