对象、消息、运行期--13:runtime方法交换

2023-11-22 08:20:50 浏览数 (2)

方法交换

在runtime运行时中,可以根据IMP函数指针去获取函数地址,通过交换俩个方法指针实现方法功能交换

  • 获取方法地址
代码语言:javascript复制
Method class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
  • 交换方法地址,相当于交换实现方式
代码语言:javascript复制
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个有效方法

0 人点赞