`
liubo0_0
  • 浏览: 21826 次
社区版块
存档分类
最新评论

消息转发机制

    博客分类:
  • IOS
阅读更多

之前想了解runtime的先关知识,无意中发现了消息转发机制,就自己动手写了些。

 


 

如上图所示:在oc中调用方法时,本类及父类找不到此方法时,有如下步骤。
要重写一下方法。

 

第一步:尝试动态方法解析

 

void dynamicMethod(id self, SEL _cmd)
{
    printf("SEL %s did not exist\n",sel_getName(_cmd));
}

+ (BOOL) resolveInstanceMethod:(SEL)aSEL
{
    
    class_addMethod([self class], aSEL, (IMP)dynamicMethod, "v@:");
    return YES;
}

 

第二步:如果第一步返回NO,则进行【尝试快速消息转发】

 

-(id)forwardingTargetForSelector:(SEL)aSelector
{
    Proxy *p = [[Proxy alloc] init];
    if ([p respondsToSelector:aSelector])
    {
        return p;
    }
    return nil;
}

 

第三步:如果第第二步返回nil,则进行【尝试标准消息转发】

 

//检测此消息是否有效。
-(NSMethodSignature *) methodSignatureForSelector:(SEL)aSelector
{
   return  [Proxy instanceMethodSignatureForSelector:aSelector];
}


-(void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL name = [anInvocation selector];
    NSLog(@" >> forwardInvocation for selector %@", NSStringFromSelector(name));
    Proxy * proxy = [[Proxy alloc] init];
    if ([proxy respondsToSelector:name]) {
        [anInvocation invokeWithTarget:proxy];
    }
    else {
        [super forwardInvocation:anInvocation];
    }
}

 

注:
调用函数:

 

 [foo performSelector:@selector(MissMethod)];

 

Proxy类

 

@implementation Proxy

-(void)MissMethod
{
    NSLog(@" >> MissMethod() called in Proxy.");
}

@end

 

  • 大小: 28 KB
0
0
分享到:
评论

相关推荐

    iOS消息转发机制在项目中的应用

    iOS的消息转发机制是Objective-C(OC)语言中一个至关重要的特性,它允许对象在接收到无法响应的消息时有机会处理或转发这些消息。这一机制对于理解OC的动态性以及解决一些特定问题,如方法的动态绑定、类的扩展等,...

    iOS消息转发机制及避免崩溃的解决方案.pdf

    iOS的消息转发机制是Objective-C运行时系统中一个关键特性,它允许对象在接收到未实现的方法调用时,有机会去处理或转发这个消息,从而防止程序因无法识别选择子(selector)而崩溃。这一机制主要包含三个步骤: 1....

    ios runtime消息转发机制

    本文将深入探讨“ios runtime消息转发机制”,理解这个机制对于优化代码、解决潜在问题以及实现高级功能至关重要。 消息转发是Objective-C运行时系统的一个关键组成部分,它在对象接收到无法识别的消息时提供了一种...

    ios消息转发机制

    在iOS开发中,消息转发机制是Objective-C运行时(Runtime)系统的一个重要特性,它使得对象在接收到无法响应的消息时,有机会进行处理,而不是直接抛出“未定义选择子”(Undefined selector)的错误。这个机制提高...

    ios-对象的消息转发机制.zip

    当你向一个对象发送一个它不理解的消息时,系统会启动一系列的挽救措施,这就是消息转发机制。这个过程允许我们增强程序的健壮性,提供额外的错误检测,以及实现一些高级的设计模式。 1. **消息未被接收时的处理...

    Objective-C中消息转发机制demo

    在Objective-C中,消息传递是其动态性的重要体现,而消息转发机制则是这种动态性的一个关键组成部分。本教程将深入探讨Objective-C的消息转发机制及其实际应用。 首先,我们需要理解消息传递在Objective-C中的基本...

    swift-iOS基于消息转发机制实现弱引用计时器

    在iOS开发中,Swift语言提供了一种强大的特性,即消息转发机制,这使得开发者能够处理未定义的方法调用。在本教程中,我们将探讨如何利用这个机制来实现一个基于弱引用的计时器,以避免内存泄漏的问题。首先,我们...

    iOS runtimeIMP指针和消息转发机制Demo

    本文将详细探讨“iOS runtimeIMP指针和消息转发机制Demo”中的核心概念,包括Runtime、IMP指针以及消息转发机制,并通过一个名为`MethodSwizzlingIMPdemo`的示例来阐述它们的实际应用。 1. **Runtime(运行时)**:...

    Runtime_消息转发机制

    消息转发机制是Runtime系统中一个非常关键的概念,它处理那些未能在接收对象中找到对应方法调用的情况。当一个对象收到一个它无法响应的消息时,Runtime会启动一系列的步骤来尝试解决这个问题,这就是消息转发机制。...

    交换机的报文转发机制

    交换机的报文转发机制 交换机的报文转发机制是计算机网络中的一种关键技术,涉及到数据链路层和网络层的协议。它是指交换机在接收到数据包后,对其进行分析、处理和转发的机制。 报文转发机制是交换机的核心功能之...

    IOS消息转发

    3. **日志记录**:当对象接收到未知消息时,可以通过消息转发机制记录这些消息,帮助调试和优化代码。 4. **安全性**:防止因为对象无法响应某些方法导致的应用崩溃,通过消息转发可以优雅地处理这种情况。 总结,...

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (类,对象,方法,消息传递,消息转发).zip

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (类,对象,方法,消息传递,消息转发).zip,iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (类,对象,方法,消息传递,消息转发)

    Message_消息转发_

    例如,JaxbOAuth2AccessTokenMessageConverter可能用于将来自服务器的OAuth2响应转换成Java对象,以便进一步处理,而消息转发机制则可以帮助处理那些预期之外的情况,保证系统的稳定性和容错性。 总之,消息转发是...

    论文研究-基于机会网络中社交关系的转发机制.pdf

    由于现有的机会网络转发机制不能完全适应社会网络中基于社交关系的判断与分析,为此通过建立社交关系的分类,构建机会网络中的社会...通过仿真实验,所提出的转发机制有效地降低了网络中的消息副本数和降低了路由开销。

    [17个软件测试文档]-7存储转发机制优化系统测试方案及案例

    在软件测试领域,存储转发机制是一个关键的概念,尤其在优化系统性能时显得尤为重要。存储转发机制是网络通信中的一种数据处理方式,它涉及到如何在网络节点间传输数据包。本测试方案将深入探讨这一机制,并提供具体...

    网络消息转发软件

    网络消息转发软件是一种重要的通信工具,它在广域网环境下能有效地实现实时或非实时的数据传输,确保信息在两点之间高效、安全地传递。这种软件通常基于P2P(peer-to-peer)技术,允许网络上的设备直接进行交互,而...

    C# socket聊天 服务器转发

    本项目“C# socket聊天 服务器转发”着重讲解了如何构建一个基于C#的Socket聊天系统,其中包含了客户端(client)和服务器端(server)的实现,以及通过服务器进行消息的转发机制。 首先,让我们了解Socket的基本...

    绿色路由器的低功耗FIS转发机制及其能耗分析.pdf

    2. 低功耗转发机制:低功耗转发机制是在路由器设计中,通过优化转发算法和结构设计,减少硬件资源消耗,尤其是降低能耗的关键技术。文章提到的FIS转发机制是该领域的一种新思路。 3. FIS转发机制:FIS(Forwarding ...

Global site tag (gtag.js) - Google Analytics