美文网首页
Runtime消息转发机制

Runtime消息转发机制

作者: 升哥_d84b | 来源:发表于2020-07-20 21:56 被阅读0次

    一.消息转发机制

        void sendMessage(idself,SEL_cmd,NSString* msg){

            NSLog(@"1===hello");

        }

      1.动态方法解析(resolveInstanceMethod)

        + (BOOL)resolveInstanceMethod:(SEL)sel{

              if([NSStringFromSelector(sel) isEqualToString:@"sendMessage:"]){

               returnclass_addMethod(self, sel, (IMP)sendMessage,"v@:@");

            }

            return NO;

        }

      2.快速转发(forwardingTargetForSelector)

        - (id)forwardingTargetForSelector:(SEL)aSelector{

            NSString* methodName =NSStringFromSelector(aSelector);

            if([methodNameisEqualToString:@"sendMessage:"]){

                return[MessageObjectnew];

            }

            return [super forwardingTargetForSelector:aSelector];

        }

      3.慢速转发

        方法1.methodSignnatureForSeletor

        方法2.forwardinvocation

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

            NSString*methodName =NSStringFromSelector(aSelector);

            if([methodNameisEqualToString:@"sendMessage:"]){

            return [NSMethodSignature signatureWithObjCTypes:"v@:@"];

        }

            return [super methodSignatureForSelector:aSelector];

        }    

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

            SELsel = [anInvocationselector];

            MessageObject *object = [MessageObject new];

            if([objectrespondsToSelector:sel]){

                [anInvocationinvokeWithTarget:object];

            }else{    

                [superforwardInvocation:anInvocation];    

            }

        }

      4.方法没实现调用

      doesNotRecognizeSelector

    - (void)doesNotRecognizeSelector:(SEL)aSelector{

        NSLog(@"方法未实现");

    }

    相关文章

      网友评论

          本文标题:Runtime消息转发机制

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