方法缓存查找
- 检查接收者 receiver 的类缓存中是否有 @selector(message) 对应的实现(IMP)。
类方法列表查找
- 若缓存未命中,遍历当前类的 method_list 查找方法。
父类链查找
- 若当前类未找到,递归向父类查找,直到根类(NSObject)。
动态方法解析
- 若最终未找到,触发 +resolveInstanceMethod: 或 +resolveClassMethod:。
3.1 动态方法解析(Dynamic Method Resolution)
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(foo)) {
class_addMethod([self class], sel, (IMP)dynamicFooIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
3.2 备用接收者(Fast Forwarding)
- (id)forwardingTargetForSelector:(SEL)aSelector {
if (aSelector == @selector(foo)) {
return [BackupClass new]; // 将消息转发给其他对象处理
}
return [super forwardingTargetForSelector:aSelector];
}
3.3 完整消息转发(Normal Forwarding)
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
if (aSelector == @selector(foo)) {
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
return [super methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
if (anInvocation.selector == @selector(foo)) {
[self customHandleInvocation:anInvocation];
} else {
[super forwardInvocation:anInvocation];
}
}