运行时消息转发

2019-12-07  本文已影响0人  一笔春秋

原理

流程图

301129-a1159ef51f453da8.png

代码实现

进行一次发送消息会在相关的类对象中搜索方法列表,如果找不到则会沿着继承树一直搜索直到继承树的根部(通常为NSObject),如果还是找不到并且消息转发都失败了就会执行doesNotRecognizeSelector:方法报 unrecongnized selector

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //执行foo函数
    [self performSelector:@selector(test)];
}

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    return YES;//返回YES,进入下一步转发
}

- (id)forwardingTargetForSelector:(SEL)aSelector {
    return nil;//返回nil,进入下一步转发
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if ([NSStringFromSelector(aSelector) isEqualToString:@"test"]) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }
    
    return [super methodSignatureForSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    SEL sel = anInvocation.selector;

    Person *p = [Person new];
    if([p respondsToSelector:sel]) {
        [anInvocation invokeWithTarget:p];
    }
    else {
        [self doesNotRecognizeSelector:sel];
    }

}

@end

Runtime常见的应用场景

上一篇 下一篇

猜你喜欢

热点阅读