消息发送和消息转发

方法缓存查找

  • 检查接收者 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];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容