oc 基础 - runtime_msgSend

93 阅读1分钟

// 方法查找流程

person test];

objc_msgsend(person, sel_registerName(test)); objc_msgsend(person, #selector(test));

OC 消息机制 给方法调用者发送消息

消息接受者 receiver 消息名称 test

分为三大阶段 消息发送 动态方法解析 消息转发

recevers ? return

cache ?

Class

rw_t ? ->cache

method_t

superClass ->

rw_t ? ->cache

// 尝试动态解析方法

`//- (void)abc {

//

//}

\

  • (void)other {

    

    NSLog(@"%s", func );

}

// d动态添加方法

//+ (BOOL)resolveInstanceMethod:(SEL)sel {

//

//    if (sel == @selector(abc)) { //动态 的体现

//

//        //获取其他方法

//        Method otherMethod = class_getInstanceMethod(self, @selector(other));

//        //动态添加

//        class_addMethod(self, sel, method_getImplementation(otherMethod), method_getTypeEncoding(otherMethod));

//        //动态添加返回YES 放到cache列表

//        return YES;

//    }

//    return [super resolveInstanceMethod:sel];

//}

\

// 进入消息转发第一个阶段

\

\

\

//- (id)forwardingTargetForSelector:(SEL)aSelector {

//

//    if (aSelector == @selector(abc)) {

//

//        // objc_msgsend([[Cat alloc]init],aselector)

//        return [[Cat alloc]init];

//    }

//    return  [super forwardingTargetForSelector:aSelector];

//

////    return []; //能够处理这个消息的对象

//}

\

// 进入消息转发第2个阶段

\

//方法签名

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

    

    // 要求返回一个方法签名

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

        

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

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

\

//        return [[[Cat alloc]init] methodSignatureForSelector:aSelector];

    }

    

    return  [super methodSignatureForSelector:aSelector];

    

}

\

\

// 封装了一个方法调用者 方法调用者.方法.方法参数

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

//    anInvocation.target = [[Cat alloc]init];

//    [anInvocation invoke];

    [anInvocation invokeWithTarget:[Cat new]];

    //可以尽情处理自己的f方法

}`