有这样一个需求:
类Target,声明两个类Target的实例targetA,targetB;
当实例targetA调用方法oriMethod时,调用oriMethod;
当实例targetB调用方法oriMethod时,则实际调用的是hook之后的方法targetMethod
当面对上述需求时,Objective-C的动态性优势就显示出来啦;
具体实现原理类同KVO底层原理,给targetB类添加观察者,在观察方法中动态的生成一个中间类,然后在中间类中将方法oriMethod和targetMethod进行methodSwizzing;
具体实现步骤:
创建一个NSObject的Category,(NSObject+Swizzing.h),在类中添加两个方法
判断原始方法(oriMethod)是否存在,如果不存在,那么直接返回,没必要进行后续操作
动态生成中间类
lt_class方法实现,用来将iSA返回父类
lt_dealloc方法,对象释放会自动调用
交换的核心方法
以上就是动态生成类以及类中添加方法的核心代码;
需要注意的是:
在ltAddObserver方法中,中间类创建出来后,一定要将修改iSA指向,否则调不到;
在ltRemoveObserver方法中,主要实现在移除观察之后,将iSA指针指回去;
还里利用associatedObject将被观察类和方法添加到全局表中(存储的是model信息)
具体代码实现 喜欢记得点星星哦