? ? ? ? method swizzle又被稱為黑魔法,它是蘋果公司給Objective-C賦予的神奇方法,同時也是Runtime應用的具體體現。黑魔法使用得好,會使你的開發更加方便,但使用不當,會產生一些意想不到的問題。好了,下面說一說,在具體使用的一些坑:
1、在load方法中交換方法時未能保證只交換一次,如下圖:
這種寫法在通常情況下,方法交換是沒有問題的,不會出現什么意外,但是,一旦在多人共同開發一個項目的時候,或者有小白型開發者加入到開發中,在某個地方不小心又主動調用了load方法,哈哈,那么就會出現一些不可預測的事情了。為什么呢?大部分iOSer都知道原因的,在這里就略過了,為了防止這種情況的出現,使用dispatch_once讓方法交換只會發生一次,如下圖:
2、子類沒有實現父類的方法,卻在子類中交換了父類的方法。此時大家覺得會出問題嗎?項目運行后,調用交換后的方法,匯報如下的錯誤:
那該如何解決呢?其實問題是出在:子類里面沒法找到該方法的實現。既然這樣,在交換的時候,先嘗試給子類本身添加要交換的方法,然后再將父類的IMP給swizzle。具體實現代碼如下:
3、交換的方法,在子類和父類中都沒有實現。那么,第二種情況的解決方案還試用嗎?答案是不適用的。會陷入遞歸調用中。這時,如下圖:
方法交換不成功,此時就會出現:helloword(SEL) -->xt_studentInstanceMethod(IMP),而由于helloword(IMP)并不存在,從而使得,xt_studentInstanceMethod(SEL)-->xt_studentInstanceMethod(IMP)還是存在的,所以就會出現遞歸調用問題。為了解決這個問題,那就自己手動實現添加一個IMP,來打破遞歸調用。具體代碼如下圖:
總結:這只是自己在實際開發中遇到的問題的總結,難免會有不恰當的地方,歡迎各位iOSer指出問題,大家共同進步。同時,附上相關的代碼:Method Swizzle