相信大家都有想替换掉系统原生方法和许多第三方库私有方法的经历,那么通过method_exchangeImplementations可以实现这一想法
首先导入<objc/runtime.h>
#import <objc/runtime.h>
具体实现代码如下
- (void)viewDidLoad {
[super viewDidLoad];
[ViewController AMethod];
[self BMethod];
//getClassMethod获取类方法
Method AMethod = class_getClassMethod([self class], @selector(AMethod));
//getInstanceMethod获取实例方法
Method BMethod = class_getInstanceMethod([self class], @selector(BMethod));
//交换IMP指针(每个方法都有相对应的IMP指针,exchangeImplementations可以交换两个方法的指针)
method_exchangeImplementations(AMethod, BMethod);
NSLog(@"-------分割线-------");
[ViewController AMethod];
[self BMethod];
}
//类方法
+ (void)AMethod
{
NSLog(@"Im AMethod");
}
//实例方法
- (void)BMethod
{
NSLog(@"Im BMethod");
}
那么遇到第三方库没有暴露的类,而你又想替换其方法的时候该怎么办呢?
首先你需要知道他的类名,和你想替换的该类的方法名。
具体步骤如下
//获取到未暴露的类
Class cls = NSClassFromString(@"未暴露的类名");
//拿到该类你想替换掉的方法
Method PMethod = class_getClassMethod(cls, @selector(你知道的该类的方法));
最后使用method_exchangeImplementations方法替换成你写的方法即可。
网友评论