1、需求:
如果要扩展方法,不改变方法名,也不改变类名,要怎么做才好呢?
2、解决方案:
可以使用OC HOOK原理把函数体给换了。
3、OC HOOK 原理:
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
4、使用:
1)IMP method_setImplementation(Method m,IMP imp):设置一个方法的实现
m:目标方法
imp:方法的实现
2)BOOL class_addMethod(Class cls, SEL name, IMP imp,const char *types):给一个类添加一个类方法
cls:目标类
name:指定该方法名称的选择器
imp:新方法的实现
types:字符数组,描述类型的参数
3)Method class_getInstanceMethod(Class cls, SEL name):获取一个实例方法
cls:目标类
name:指定该方法名称的选择器
4)Method class_getClassMethod(Class cls, SEL name)获取一个类方法
5)IMP class_getMethodImplementation(Class cls, SEL name):获取cls中方法名为name的方法的实现
6)IMP method_getImplementation(Method m):获取一个方法的实现
7)void method_exchangeImplementations(Method m1, Method m2):交换两个方法的实现(注意:交换两个方法的实现也会把方法m2的调用对象换成m1的调用对象,m1的调用对象不变)