selector

iOS 使用_objc_msgForward直接进入消息转发流程

2020-05-23  本文已影响0人  落夏简叶

导读:一般调用一个实例方法,会先找缓存,再到类找方法的实现,找到就会调用。那么如何在有方法的实现的情况下,如何让其直接进入消息转发流程?

Demo:

  1. XXPerson,提供一个打印名字的方法。
- (void)printName {
    NSLog(@"My name is Luo.");
}

- (id)forwardingTargetForSelector:(SEL)aSelector {
    if ([NSStringFromSelector(aSelector) isEqualToString:@"printName"]) {
        return [[XXLuo alloc] init];
    }
    
    return nil;
}
  1. XXLuo,提供一个打印名字的方法(注意这里的名字和上面方法的名字有区别),此方法用于消息转发。
- (void)printName {
    NSLog(@"My name is LuoXia.");
}
  1. 调用 _objc_msgForward可直接进入消息转发流程,即使有方法的实现。
- (void)viewDidLoad {
    [super viewDidLoad];
    
    XXPerson *luo = [[XXPerson alloc] init];
    [luo printName];
//_objc_msgForward直接进入消息转发流程
    ((void(*)(id, SEL))_objc_msgForward)((id) luo, @selector(printName));
}
上一篇下一篇

猜你喜欢

热点阅读