? ? ? ? method swizzle又被稱為黑魔法滑沧,它是蘋果公司給Objective-C賦予的神奇方法俩滥,同時也是Runtime應(yīng)用的具體體現(xiàn)徒爹。黑魔法使用得好荚醒,會使你的開發(fā)更加方便,但使用不當隆嗅,會產(chǎn)生一些意想不到的問題腌且。好了,下面說一說榛瓮,在具體使用的一些坑:
1、在load方法中交換方法時未能保證只交換一次巫击,如下圖:
這種寫法在通常情況下禀晓,方法交換是沒有問題的精续,不會出現(xiàn)什么意外,但是粹懒,一旦在多人共同開發(fā)一個項目的時候重付,或者有小白型開發(fā)者加入到開發(fā)中,在某個地方不小心又主動調(diào)用了load方法凫乖,哈哈确垫,那么就會出現(xiàn)一些不可預(yù)測的事情了。為什么呢帽芽?大部分iOSer都知道原因的删掀,在這里就略過了,為了防止這種情況的出現(xiàn)导街,使用dispatch_once讓方法交換只會發(fā)生一次披泪,如下圖:
2、子類沒有實現(xiàn)父類的方法搬瑰,卻在子類中交換了父類的方法款票。此時大家覺得會出問題嗎?項目運行后泽论,調(diào)用交換后的方法艾少,匯報如下的錯誤:
那該如何解決呢?其實問題是出在:子類里面沒法找到該方法的實現(xiàn)翼悴。既然這樣缚够,在交換的時候,先嘗試給子類本身添加要交換的方法抄瓦,然后再將父類的IMP給swizzle潮瓶。具體實現(xiàn)代碼如下:
3、交換的方法钙姊,在子類和父類中都沒有實現(xiàn)毯辅。那么,第二種情況的解決方案還試用嗎煞额?答案是不適用的思恐。會陷入遞歸調(diào)用中。這時膊毁,如下圖:
方法交換不成功胀莹,此時就會出現(xiàn):helloword(SEL) -->xt_studentInstanceMethod(IMP),而由于helloword(IMP)并不存在婚温,從而使得描焰,xt_studentInstanceMethod(SEL)-->xt_studentInstanceMethod(IMP)還是存在的,所以就會出現(xiàn)遞歸調(diào)用問題。為了解決這個問題荆秦,那就自己手動實現(xiàn)添加一個IMP篱竭,來打破遞歸調(diào)用。具體代碼如下圖:
總結(jié):這只是自己在實際開發(fā)中遇到的問題的總結(jié)步绸,難免會有不恰當?shù)牡胤讲舯疲瑲g迎各位iOSer指出問題,大家共同進步瓤介。同時吕喘,附上相關(guān)的代碼:Method Swizzle