美文网首页
消息传递-缓存-转发流程

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

作者: 小行为 | 来源:发表于2018-11-20 19:13 被阅读9次

    消息传递

    屏幕快照 2018-11-17 上午11.00.23.png 屏幕快照 2018-11-17 上午11.01.37.png

    缓存查找

    哈希查找

    屏幕快照 2018-11-17 上午11.10.23.png
    在当前类中查找
    对于已排序号的列表 采用二分查找算法查找方法对应执行函数
    对于没有排序的列表,采用一般遍历查找方法对应执行函数
    屏幕快照 2018-11-17 上午11.13.17.png

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

    消息转发

    实例转发流程: 屏幕快照 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:");
    }
     你
    

    相关文章

      网友评论

          本文标题:消息传递-缓存-转发流程

          本文链接:https://www.haomeiwen.com/subject/thaxqqtx.html