美文网首页
消息转发机制原理

消息转发机制原理

作者: Roger_max | 来源:发表于2018-10-16 15:21 被阅读27次

消息转发机制基本分为三个步骤:

1、动态方法解析
新建一个HelloClass的类,定义两个方法:

@interfaceHelloClass:NSObject
- (void)hello;
+ (HelloClass *)hi;@end

对象在接收到未知的消息时,首先会调用所属类的类方法+resolveInstanceMethod:(实例方法)或者+resolveClassMethod:(类方法)。在这个方法中,我们有机会为该未知消息新增一个”处理方法”“。不过使用该方法的前提是我们已经实现了该”处理方法”,只需要在运行时通过class_addMethod函数动态添加到类里面就可以了。

void functionForMethod(id self, SEL _cmd)
{
 NSLog(@"Hello!");
}
Class functionForClassMethod(id self, SEL _cmd)
{
 NSLog(@"Hi!");
 return [HelloClass class];
}

#pragma mark - 1、动态方法解析

+ (BOOL)resolveClassMethod:(SEL)sel
{
NSLog(@"resolveClassMethod");
NSString *selString = NSStringFromSelector(sel);
if ([selString isEqualToString:@"hi"])
{
Class metaClass = objc_getMetaClass("HelloClass");
class_addMethod(metaClass, @selector(hi), (IMP)functionForClassMethod, "v@:");
return YES;
}
return [super resolveClassMethod:sel];
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSLog(@"resolveInstanceMethod");
NSString *selString = NSStringFromSelector(sel);
if ([selString isEqualToString:@"hello"])
{
class_addMethod(self, @selector(hello), (IMP)functionForMethod, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];

2、备用接受者
#pragma mark - 2、备用接收者

- (id)forwardingTargetForSelector:(SEL)aSelector
{
NSLog(@"forwardingTargetForSelector");
NSString *selectorString = NSStringFromSelector(aSelector);
// 将消息交给_helper来处理? ? if ([selectorString isEqualToString:@"hello"]) {
 return _helper;
}
return [super forwardingTargetForSelector:aSelector];
}

在本类中需要实现这个新的接受对象

@interfaceHelloClass()
{
RuntimeMethodHelper *_helper;
}
@end
@implementationHelloClass- (instancetype)init
{
self = [super init];
if (self)
{
_helper = [RuntimeMethodHelper new];
}
 return self;
}
RuntimeMethodHelper 类需要实现这个需要转发的方法:

#import"RuntimeMethodHelper.h"
@implementationRuntimeMethodHelper- (void)hello
{
 NSLog(@"%@, %p", self, _cmd);
}@end

3、完整转发
如果动态方法解析和备用接受者都没有处理这个消息,那么就会走完整消息转发:

#pragma mark - 3、完整消息转发

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
NSLog(@"forwardInvocation");
if ([RuntimeMethodHelper instancesRespondToSelector:anInvocation.selector]) {
[anInvocation invokeWithTarget:_helper];
}
}
/*必须重新这个方法,消息转发机制使用从这个方法中获取的信息来创建NSInvocation对象*/
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
    if (!signature)
    {
        if ([RuntimeMethodHelper instancesRespondToSelector:aSelector]) {
           signature = [RuntimeMethodHelper instanceMethodSignatureForSelector:aSelector];
        }
    }
    return signature;
}

实测示例

2.png

相关文章

  • 消息转发机制原理

    消息转发机制基本分为三个步骤: 1、动态方法解析新建一个HelloClass的类,定义两个方法: 对象在接收到未知...

  • 消息转发机制原理

    转自Leesim的博客,mark一下,方便以后查阅 原文地址 https://www.jianshu.com/p/...

  • 消息转发机制原理?

    iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制https://www.jians...

  • Runtime

    相关简单介绍 消息机制消息传递机制消息转发机制-动态添加方法消息转发机制-快速转发消息转发机制-慢速转发消息转发机...

  • iOS 消息转发机制

    今天大概学习了下iOS的消息转发机制,还是挺有收获,在此做下笔记,以便后面温习。 1.iOS的消息转发机制原理如下...

  • runtime系列文章总结

    《iOS Runtime详解(消息机制,类元对象,缓存机制,消息转发)》《消息转发机制与Aspects源码解析》《...

  • iOS NSProxy消息转发

    NSProxy的消息转发机制,实现原理在GNUstep Base[http://www.gnustep.org/r...

  • iOS底层原理:消息转发机制

    在 iOS底层原理:objc_msgSend之缓存查找[https://www.jianshu.com/p/195...

  • iOS消息转发机制

    消息转发机制: 消息转发机制是相对于消息传递机制而言的。 1、消息(传递)机制 RunTime简称运行时。就是系统...

  • 《Effective Objective-C 2.0 》 阅读笔

    第12条:理解消息转发机制 1. 消息转发机制 当对象接收到无法解读的消息后,就会启动“消息转发”机制,开发者可经...

网友评论

      本文标题:消息转发机制原理

      本文链接:https://www.haomeiwen.com/subject/hikhzftx.html