// 方法查找流程
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方法
}`