使用runtime 动态添加方法的应用场景:
- 如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。
代码展示
#import "Person.h"
#import <objc/runtime.h>
@implementation Person
+(BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == NSSelectorFromString(@"eat")) {
class_addMethod(self, @selector(eat), (IMP)eat, "v@:");
}
if (sel == NSSelectorFromString(@"run:")) {
class_addMethod(self, @selector(run:), (IMP)run, "v@:@");
}
if (sel == NSSelectorFromString(@"play:")) {
class_addMethod(self, @selector(play:), (IMP)play, "@@:@");
}
return [super resolveInstanceMethod:sel];
}
void eat(id self, SEL _cmd) {
NSLog(@"吃东西");
}
void run(id self, SEL _cmd, NSNumber *meter) {
NSLog(@"跑了 %@ 米", meter);
}
NSString *play(id self, SEL _cmd, NSString *ball) {
NSLog(@"踢足球 - %@",ball);
return ball;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
[p performSelector:@selector(eat)];
[p performSelector:@selector(run:) withObject:@"100"];
NSString *ball = [p performSelector:@selector(play:) withObject:@"footerball"];
NSLog(@"ball = %@", ball);
}
return 0;
}
打印的值
2022-08-03 12:18:37.195178+0800 Runtime 的相关应用场景[98335:2156011] 吃东西
2022-08-03 12:18:37.195801+0800 Runtime 的相关应用场景[98335:2156011] 跑了 100 米
2022-08-03 12:18:37.195926+0800 Runtime 的相关应用场景[98335:2156011] 踢足球 - footerball
2022-08-03 12:18:37.195998+0800 Runtime 的相关应用场景[98335:2156011] ball = footerball