RunTime运行时之动态替换和改变方法实现

#import "ViewController.h"
#import <objc/runtime.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //获取方法所有名
    [self getMethodName];
    //添加方法
    [self addMethod];
    //替换方法
    [self changeMethod];
    //改变方法实现
    [self changeMethodImpl];
    //方法实现改变后调用实验
    [self method_1];
}

#pragma 获取方法名
- (void)getMethodName{
    void (*useMethod)(id,SEL);
    unsigned int outCount = 0;
    Method *methods = class_copyMethodList([self class], &outCount);
    for(int i = 0;i < outCount;i++){
        Method method = methods[i];
        SEL sel = method_getName(method);
        NSLog(@"%s",sel_getName(sel));
        if(sel == @selector(method_1)){
            useMethod = (void (*)(id,SEL))[self methodForSelector:sel];
            useMethod(self,sel);
        }
    }
}

#pragma 添加方法
- (void)addMethod{
    class_addMethod([self class], @selector(method::), (IMP)method_impl, "i@:i@");
    //此时调用方法需要用performSelector,否则编译器会报错
    [self performSelector:@selector(method::) withObject:@[@"piaojin",@(25)]];
}

#pragma 动态替换方法(也可以用于替换方法实现)
- (void)changeMethod{
//method_1与method_2进行替换
    method_exchangeImplementations(class_getInstanceMethod([self class], @selector(method_1)), class_getInstanceMethod([self class], @selector(method_2)));
}

#pragma 动态替换方法实现
- (void)changeMethodImpl{
//改变method_1的实现为method_3
    class_replaceMethod([self class], @selector(method_1), (IMP)method_3, "");
}

- (void)method_1{
    NSLog(@"method_1");
}

void method_impl(id self,SEL _cmd,NSString *str,int age){
    NSLog(@"str:%@,age:%d",str,age);
}

- (void)method_2{
    NSLog(@"method_2");
}

void method_3(){
    NSLog(@"method_3");
}

@end
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值