您的位置:首页 > 其它

运行时动态方法交换

2016-03-20 00:09 260 查看

运行时动态方法交换

当程序加载进内存运行起来的时候,我们依然可以将类/对象的方法实现进行替换掉,这时我们需要用到运行时。主要用到了两个函数。

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));

即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  runtime