美文网首页
消息转发机制

消息转发机制

作者: 百省 | 来源:发表于2018-08-02 20:44 被阅读14次
    #import <Foundation/Foundation.h>
    #import "Airplane.h"
    #import "People.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            
            People *tom = [People new];
            //向tom发送fly消息,由于People类中没有实现该方法,会进行消息转发机制
            [(id)tom fly];
            
            
        }
        return 0;
    }
    
    #import <Foundation/Foundation.h>
    
    @interface People : NSObject
    -(void)fly;
    @end
    
    #import <objc/runtime.h>
    #import "People.h"
    #import "Airplane.h"
    
    void dyMethod(){
        printf("hello world \r\n");
    }
    
    @implementation People
    
    //消息转发第一步,动态方法解析
    +(BOOL)resolveInstanceMethod:(SEL)sel
    {
        if (sel == @selector(fly)) {
            //给类添加方法
            class_addMethod([self class], sel, (IMP)dyMethod, "v@:");
        return YES;
        }
        
        return [super resolveInstanceMethod:sel];
    }
    
    //消息转发第二步
    -(id)forwardingTargetForSelector:(SEL)aSelector
    {
        if (aSelector == @selector(fly))
        {
            //转发给其他target处理fly消息
            return [Airplane new];
        }
        
        return [super forwardingTargetForSelector:aSelector];
    }
    
    //消息转发第三步
    -(void)forwardInvocation:(NSInvocation *)anInvocation
    {
        SEL sel = anInvocation.selector;
        if (sel == @selector(fly))
        {
            //生成新的对象处理fly消息
            Airplane *animal = [Airplane new];
            [anInvocation invokeWithTarget:animal];
        }
    }
    //先调用方法签名函数,再进入forwardInvocation
    -(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
    {
        if (aSelector == @selector(fly)) {
            return [NSMethodSignature signatureWithObjCTypes:"v@:"];
        }
        
        return nil;
    }
    
    @end
    
    #import <Foundation/Foundation.h>
    
    @interface Airplane : NSObject
    
    -(void)fly;
    
    @end
    
    
    #import "Airplane.h"
    
    @implementation Airplane
    
    -(void)fly
    {
        NSLog(@"Animal fly");
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:消息转发机制

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