Bug_使用runtime时交换方法出现的bug

实现场景:

在为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进行方法交换时, 需要格外注意交换的方法的调用问题, 以及防止出现循环调用.

你可能感兴趣的:(Bug_使用runtime时交换方法出现的bug)