之前内容:
01Class的结构
消息机制大概可以分为三个阶段(个人理解)
- 消息发送阶段
- 方法动态解析阶段
- 消息转发阶段
消息发送
所有的方法最终会转为objc_msgSend调用,那么我们只需要了解objc_msgSend做了什么就可以了,直接看源码,搜索objc_msgSend,一步步找,最终你会找到这个函数lookUpImpOrForward,原图如图
lookUpImpOrForward源码1.png lookUpImpOrForward源码2.png lookUpImpOrForward源码3.png从图中代码可以看出,消息发送的一个流程,整理了一下,大概如下:
消息发送流程.png动态方法解析
动态方法解析其实就是找不到方法后,会尝试找一下方法
- +resolveInstanceMethod:
- +resolveClassMethod:
你可以在这里动态添加一个方法来解决,解决后,会重新走消息发送的流程,比如下面
+ (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];
}
假设你不处理的话,那么就会进入到消息转发阶段
消息转发
消息转发只需要关注三个方法
- (+ -)(id)forwardingTargetForSelector:
- (+ -)(NSMethodSignature *)methodSignatureForSelector:
- (+ -)(void)forwardInvocation:
forwardingTargetForSelector可以返回一个转发的其它对象,如果为nil,就会调用methodSignatureForSelector,这里可以返回一个方法签名,之后会封装成签名对象来调用forwardInvocation,具体流程图如下
消息转发流程图扩展
NSMethodSignature的生成可以用以下代码
[NSMethodSignature signatureWithObjCTypes:"i@:i"];
[[[Person alloc] init] methodSignatureForSelector:@selector(run)];
网友评论