Runtime实现对象方法的实现交换

本文通过一个具体的示例,展示了如何在Objective-C中利用运行时特性来交换两个对象方法的实现,从而改变类的行为,例如将英语问候改为中文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:

我们有一个"Person"类,有一个对象方法"sayHiWithEnglish",打印输出英文"hello"。我们仍想调用此方法,但想打印中文"你好"。

怎么办呢?此时,我们需要使用运行时交换两个对象方法的实现即可。

代码很简单,注释很详细,不再做过多解释。

// 本类

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)sayHiWithEnglish;

@end

#import "Person.h"

@implementation Person

- (void)sayHiWithEnglish{
    NSLog(@"hello");
}

@end
// 分类

#import "Person.h"

@interface Person (Extension)

@end

#import "Person+Extension.h"
#import <objc/runtime.h> // 导入头文件

@implementation Person (Extension)

//当应用启动时,会对项目中所有的类进行一次加载,此时就会调用该方法
+ (void)load{
    
    // 获取老方法
    Method oldM = class_getInstanceMethod([self class], @selector(sayHiWithEnglish));
    // 获取用于交换实现的新方法
    Method newM = class_getInstanceMethod([self class], @selector(sayHiWithChinese));
    
    // 运行时交换两个方法的实现
    method_exchangeImplementations(oldM, newM);
}

// 当该类被首次使用时调用
+ (void)initialize{
    
}

// 新方法,用于替换老方法的实现
- (void)sayHiWithChinese{
    NSLog(@"你好");
}

@end

调用:

- (void)viewDidLoad {
    [super viewDidLoad];
 
    Person *per = [[Person alloc] init];
    [per sayHiWithEnglish];
}

// 打印输出的是中文“你好”

 

转载于:https://www.cnblogs.com/panda1024/p/6369406.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值