消息转发机制

2018-08-02  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读