OC采用的是懒加载机制,只要一个方法实现了,就会添加到方法列表中占用内存。而很多时候,很多功能在某些用户那里是很少用到的,比如腾讯的xx会员,你不充值,是无法使用会员提供的服务的。这种情况下,可以考虑使用Runtime动态添加方法。
- ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
TestModel *testModel = [[TestModel alloc] init];
//performSelector在动态添加方法时使用
[testModel performSelector:@selector(write:)
withObject:@"动态添加方法测试"];
}
- TestModel.m:创建TestModel用于Runtime测试动态添加方法
#import "TestModel.h"
#import <objc/message.h>//用于导入Runtime
@implementation TestModel
void writeChange(id self,SEL _cmd,NSString *str)
{
NSLog(@"测试动态添加方法:%@",str);
}
//只要一个对象调用了一个未实现的方法就会调用这个方法进行处理,用于动态添加方法时,处理未实现方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
//找到未实现的方法
if (sel == NSSelectorFromString(@"write:")) {
/**
* 动态添加方法
* 参数1 添加方法的类
* 参数2 添加哪个方法
* 参数3 方法实现,替换方法(其实是函数)
* 参数4 方法类型,参考文档 Type Encodings
*/
class_addMethod(self, sel, (IMP)writeChange, "v@:@");
return YES;
}
return [super resolveInstanceMethod:sel];
}
@end
- 运行效果