方法交换
在runtime运行时中,可以根据IMP函数指针去获取函数地址,通过交换俩个方法指针实现方法功能交换
- 获取方法地址
Method class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
- 交换方法地址,相当于交换实现方式
void method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)
示例:
代码语言:javascript复制 NSString *str = @"ABCabc";
NSLog(@"--%@",[str lowercaseString]);
NSLog(@"--%@",[str uppercaseString]);
// 获取方法地址
Method method1 = class_getInstanceMethod([NSString class], @selector(lowercaseString));
Method method2 = class_getInstanceMethod([NSString class], @selector(uppercaseString));
// 交换方法地址,相当于交换实现方式
method_exchangeImplementations(method1,method2);
NSLog(@"--%@",[str lowercaseString]);
NSLog(@"--%@",[str uppercaseString]);
log:
--abcabc
--ABCABC
--ABCABC
--abcabc
参考
Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法