简介
runtime之前一直只是看了理论,今天写了几个小demo,放在这里
原理
消息转发过程:
- 动态解析
- 快转发(接收者重定向)
- 慢转发(完整转发,方法重定向)
image.png
动态解析
流程:
- (void)viewDidLoad{
[self performSelector:@selector(test)];
}
+ (BOOL)resolveInstanceMethod:(SEL)sel{
if(sel == @selector(test)){
//如果selector是test,那么就动态解析,指定新的方法
class_addMethod([self class], sel, (IMP)newTest, @"v@:");
}
return [super resolveInstanceMethod:sel];
}
void newTest(id obj,SEL _cmd){
NSLog(@"method here");
}
输出:
method here
基本流程为:
如果在方法队列找不到方法,那么就先执行动态解析。
解析中可以添加新方法。
//对象方法未找到使用此方法
+ (BOOL)resolveInstanceMethod:(SEL)sel;
//类方法未找到使用此方法
+ (BOOL)resolveClassMethod:(SEL)sel;
接受者重定向
原理:
@implementation ViewController
- (void)viewDidLoad{
[self performSelector:@selector(test)];
}
- (id)forwardingTargetForSelector:(SEL)aSelector{
if(aSelector == @selector(test)){
//传送给SecondViewController
return [[SecondViewController alloc] init];
}
return [super forwardingTargetForSelector:aSelector];
}
@end
//---------------------------------------
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)test{
NSLog(@"123");
}
@end
输出:
method here
基本流程为:
如果动态解析失败,则把方法交给其他类
//重定向对象方法的消息接受者
- (id)forwardingTargetForSelector:(SEL)aSelector{
//重定向类方法的消息接受者
+ (id)forwardingTargetForSelector:(SEL)aSelector{
