导读:一般调用一个实例方法,会先找缓存,再到类找方法的实现,找到就会调用。那么如何在有方法的实现的情况下,如何让其直接进入消息转发流程?
Demo:
- 类
XXPerson
,提供一个打印名字的方法。
- (void)printName {
NSLog(@"My name is Luo.");
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([NSStringFromSelector(aSelector) isEqualToString:@"printName"]) {
return [[XXLuo alloc] init];
}
return nil;
}
- 类
XXLuo
,提供一个打印名字的方法(注意这里的名字和上面方法的名字有区别),此方法用于消息转发。
- (void)printName {
NSLog(@"My name is LuoXia.");
}
- 调用
_objc_msgForward
可直接进入消息转发流程,即使有方法的实现。
- (void)viewDidLoad {
[super viewDidLoad];
XXPerson *luo = [[XXPerson alloc] init];
[luo printName];
//_objc_msgForward直接进入消息转发流程
((void(*)(id, SEL))_objc_msgForward)((id) luo, @selector(printName));
}
- [luo printName] // My name is Luo.
-
_objc_msgForward:// My name is LuoXia.
image.png
网友评论