用一个示例说明
首先介绍两个方法
//参数1:需要交换方法的所属类 class 参数2:改方法
//class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
//交换方法 参数1:方法1 参数2:方法2
//method_exchangeImplementations(<#Method m1#>, <#Method m2#>)
先准备一下,为NSString添加一个分类如下
@interface NSString (Addition)
- (NSString *) my_lowercaseString;
@end
@implementation NSString (Addition)
//当然该方法不能直接使用,否则进入死循环
- (NSString *)my_lowercaseString {
//不要担心下面会进入死循环,因为交换后它指向了lowercaseString,相当于调用了原方法,
NSString *lowercase = [self my_lowercaseString];
NSLog(@"%@ -> %@", self, lowercase);//这里做一些其他事
return lowercase;
}
@end
现在开始
//需要导入#import <objc/runtime.h>和刚才的分类
//1、获取两个要交换的方法(这里以字符串转换为例)
Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class], @selector(my_lowercaseString));
//2、交换上面两个
method_exchangeImplementations(originalMethod, swappedMethod);
//现在在使用转换小写时,就会调用我们的方法了
[@"WWW" lowercaseString];
//这时候打印将输出 WWW => www
个人感觉实际中很少这么做,主要是用于调试,解决问题,追踪问题