實現場景:
在為UITextField添加了一個分類方法 placeHolderColor, 用來設置文本輸入框占位文字的顏色, 能夠快速設置占位文字顏色, 而不需要通過修改占位文字顏色的富文本屬性等到的操作, 這樣做雖然可以實現, 但是當占位文字顏色先于占位文字設置時, 就無法利用該分類方法快速設置, 原因在于OC的懶加載機制使得當UILabel中的text的值為nil時, 無法對其發送textColor方法, 也就無法達到修改其顏色的目的, 而?解決方案就是為系統的UITextField動態的添加一個成員變量, 用來記錄傳進來的值, 等到text有值時, 再修改其顏色.
1.當外界先調用(系統自帶的)placeHolder設置占位文字,在調用分類方法設置顏色時, continue
2.當外界先調用分類方法設置顏色,再調用(系統自帶的)placeHolder設置占位文字時,需要做到將之前
已經保存在添加的成員變量的值,賦值給已經有值了的占位文字,修改其顏色.也就相當于,在外界調用placeHolder時,除了保持之前的做法之外,還需要完成賦值操作, 當在調用系統方法A時,應該讓其調用方法B.這時就需要用到runtime的方法交換
Bug重現:?
//1.獲取系統方法
MethodplaceHolder =class_getInstanceMethod(self,@selector(setPlaceholder:));
//2.獲取想要替換的方法
Methodyyh_placeHolder =? class_getInstanceMethod(self,@selector(setYyh_placeHolderColor:)); 出現Bug的地方在這里, 用來替換的方法是set_YyhPlaceHolder. 這樣做的后果就是當在調用setPlaceholder: 實際上調用的是setYyh_placeHolderColor用來設置顏色的方法, 報錯: reason: '-[UICachedDeviceRGBColor length]: unrecognized selector sent to instance. 改成set_YyhPlaceHolder后bug解決.?
總結: 當使用runtime進行方法交換時, 需要格外注意交換的方法的調用問題, 以及防止出現循環調用.