美文网首页
Bug_使用runtime时交换方法出现的bug

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

作者: 喵呜呜喵 | 来源:发表于2017-05-10 11:51 被阅读0次

    实现场景:

    在为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

          本文链接:https://www.haomeiwen.com/subject/qxowtxtx.html