OC利用Category重写父类方法
前言
在开发中,我们可能会遇到一种情况,写了几百个vc,突然需求要在每个vc改个背景色,可你却没有写个BaseVC做基类,全都继承UIViewController,此时,身为程序员的你肯定不会做一个一个改背景色这个决定,就算是重新一个一个改继承,虽然一劳永逸但也是十分蛋疼的事情,要知道,category是个好东西,我们可以利用category来重写父类方法。
方法一
直接在category重写你要重写的方法,例如:
|
|
XCode此时会提示个警告:
|
|
去除警告:
|
|
方法二
利用runtime交换方法
|
|
为什么这里要判断下:
|
|
而不直接method_exchangeImplementations呢?
因为这里有可能出现两种情况,一种是要替换的方法是父类的方法,作为子类的目标类并没有实现,另一种是要替换的方法目标类已经实现了。第一种情况的出现就是我们要判断的原因,class_addMethod
是给类添加方法,返回值是是否添加成功,如果成功说明没有实现方法,就拿新方法替换掉刚添加的方法,否则则表示实现了方法,直接交换就好。当然你也可以在NSObject添加MethodSwizzle
方法,方便其他类调用,向下面方法三一样。
方法三
也是利用运行时,手法略有不同,给NSObject添加个分类
|
|
然后在pch导入NSObject+Base
,就可以在所有类使用啦,例如在上面的例子的UIViewController+Base
:
|
|
一样可以改背景色。
总结
第一种只是简单利用宏去掉警告,二三方法本质是相同的,利用runtime交换方法,看实际情况运用。
原文作者: JackNehc
原文链接: https://jacknehc.github.io/2018/07/03/OC利用Category重写父类方法/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议