美文网首页
消息转发

消息转发

作者: 魏志军 | 来源:发表于2020-01-08 11:50 被阅读0次

    objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的

    1 如果没有实现方法

    第一步调用以下方法

    + (BOOL)resolveInstanceMethod:(SEL)sel{

        if(sel ==@selector(test)) {

    添加方法

            class_addMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>, <#IMP  _Nonnull imp#>, <#const char * _Nullable types#>)

            returnYES;

        }

        return [super resolveInstanceMethod:sel];

    }

    2 如果上面的方法没有实现 ,就调用下面的方法

    - (id)forwardingTargetForSelector:(SEL)aSelector{

        if(aSelector ==@selector(test)) {

            return[[WEIalloc]init];

        }

        return [super forwardingTargetForSelector:aSelector];

    }

    3 如果上面的方法没有实现 ,就调用下面的两个方法

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{

        if(aSelector ==@selector(test)) {

            return [NSMethodSignature signatureWithObjCTypes:@"v16@:8"];

        }

        return [super methodSignatureForSelector:aSelector];

    }

    - (void)forwardInvocation:(NSInvocation*)anInvocation{

        anInvocation.target= [[WEialloc]init];

        [anInvocationinvoke];

    }

    - (void)doesNotRecognizeSelector:

    相关文章

      网友评论

          本文标题:消息转发

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