运行时动态方法交换
当程序加载进内存运行起来的时候,我们依然可以将类/对象的方法实现进行替换掉,这时我们需要用到运行时。主要用到了两个函数。
1) Method M1 = class_getInstanceMethod([Person class], @selector(run));
Method M2 = class_getInstanceMethod([Person class], @selector(study));
2)method_exchangeImplementations(M1, M2);
第一步获取实例对象的两个方法,第二步将实例对象的两个方法实现交换。
实现代码:
- (void)viewDidLoad {
[super viewDidLoad];
Person* p = [[Person alloc] init];
[p run];
[p study];
NSLog(@"-------------------------------");
Method M1 = class_getInstanceMethod([Person class], @selector(run));
Method M2 = class_getInstanceMethod([Person class], @selector(study));
method_exchangeImplementations(M1, M2);
[p run];
[p study];
}
打印结果:
[1681:80992] 我正在跑步!
[1681:80992] 我正在学习!
[1681:80992] —————————-
[1681:80992] 我正在学习!
[1681:80992] 我正在跑步!
上面我们实现的是实例对象的方法交换,类的方法交换只需将第一个函数替换为:
Method M1= class_getClassMethod([Person class],@selector(run));
Method M2= class_getClassMethod([Person class], @selector(study));
即可。