02.消息机制

2021-09-09  本文已影响0人  白开了杯水

之前内容:
01Class的结构

消息机制大概可以分为三个阶段(个人理解)

消息发送

所有的方法最终会转为objc_msgSend调用,那么我们只需要了解objc_msgSend做了什么就可以了,直接看源码,搜索objc_msgSend,一步步找,最终你会找到这个函数lookUpImpOrForward,原图如图

lookUpImpOrForward源码1.png lookUpImpOrForward源码2.png lookUpImpOrForward源码3.png

从图中代码可以看出,消息发送的一个流程,整理了一下,大概如下:

消息发送流程.png
动态方法解析

动态方法解析其实就是找不到方法后,会尝试找一下方法

+ (BOOL)resolveClassMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        // 第一个参数是object_getClass(self)
        class_addMethod(object_getClass(self), sel, (IMP)c_other, "v16@0:8");
        return YES;
    }
    return [super resolveClassMethod:sel];
}

假设你不处理的话,那么就会进入到消息转发阶段

消息转发

消息转发只需要关注三个方法

forwardingTargetForSelector可以返回一个转发的其它对象,如果为nil,就会调用methodSignatureForSelector,这里可以返回一个方法签名,之后会封装成签名对象来调用forwardInvocation,具体流程图如下

消息转发流程图
扩展

NSMethodSignature的生成可以用以下代码

[NSMethodSignature signatureWithObjCTypes:"i@:i"];
[[[Person alloc] init] methodSignatureForSelector:@selector(run)];
上一篇 下一篇

猜你喜欢

热点阅读