消息传递-缓存-转发流程

消息传递

消息传递-缓存-转发流程_第1张图片
屏幕快照 2018-11-17 上午11.00.23.png
消息传递-缓存-转发流程_第2张图片
屏幕快照 2018-11-17 上午11.01.37.png

缓存查找

哈希查找

消息传递-缓存-转发流程_第3张图片
屏幕快照 2018-11-17 上午11.10.23.png

在当前类中查找
对于已排序号的列表 采用二分查找算法查找方法对应执行函数
对于没有排序的列表,采用一般遍历查找方法对应执行函数
消息传递-缓存-转发流程_第4张图片
屏幕快照 2018-11-17 上午11.13.17.png

三种查找方式
缓存 -> 哈希算法查找
当前类 -> 已排序 二分查找算法 未排序 遍历
通过isa父类

消息转发

实例转发流程:
消息传递-缓存-转发流程_第5张图片
屏幕快照 2018-11-17 上午11.20.25.png

void testImp (void)
{
    NSLog(@"test invoke");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    // 如果是test方法 打印日志
    
    if (sel == @selector(test)) {
        NSLog(@"resolveInstanceMethod:");

        // 动态添加test方法的实现
        class_addMethod(self, @selector(test), testImp, "v@:");
        
        return YES;
    }
    else{
        // 返回父类的默认调用
        return [super resolveInstanceMethod:sel];
    }
}

- (id)forwardingTargetForSelector:(SEL)aSelector
{
    NSLog(@"forwardingTargetForSelector:");
    return nil;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    if (aSelector == @selector(test)) {
        NSLog(@"methodSignatureForSelector:");
        // v 代表返回值是void类型的  @代表第一个参数类型时id,即self
        // : 代表第二个参数是SEL类型的  即@selector(test)
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }
    else{
        return [super methodSignatureForSelector:aSelector];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    NSLog(@"forwardInvocation:");
}
 你

你可能感兴趣的:(消息传递-缓存-转发流程)