zoukankan      html  css  js  c++  java
  • 实现消息转发功能(调用非自己类方法)

    需求要实现消息的转发     ---------》   一个Classes类,要调用People的write方法(消息转发)

    在一般情况下,给类或者对象发送一个无法识别的消息会产生一个运行时的错误,导致应用程序崩溃,但是注意,在崩溃之前,会为每个对象提供了第二次机会来处理消息。我们可以在这个时候捕捉到这条消息后可以把它重定向到可以响应该消息的对象。

         这个功能完全通过消息转发来实现,发送消息给一个无法处理该选择器的对象时,这个选择器就会被转发给 forwardInvocation 方法.接收这条消息的对象,用一个NSInvocation的实例保存原始的选择器和被请求的参数.所以,我们可以覆盖 forwardInvocation 方法,并把消息转发给另外一个对象.

    1 ---》首先就要先覆盖下面者两个方法

    methodSignatureForSelector: 的作用在于为另一个类实现的消息创建一个有效的方法签名。

    forwardInvocation: 将选择器转发给一个真正实现了该消息的对象.

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
        
        NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
        if (!signature) {
            signature = [self.people methodSignatureForSelector:aSelector];
        }
        return signature;
    }
    
    - (void)forwardInvocation:(NSInvocation *)anInvocation {
        SEL selector = [anInvocation selector];
        if ([self.people respondsToSelector:selector]) {
            [anInvocation invokeWithTarget:self.people];
        }
    }

    调用时候就可以这样写

    [(people *)Classes write];

    如果没有信息转发的话,这条语句会造成程序崩溃。

    消息转发之后,就会在内部准发给self.people来执行,程序不会崩溃。

  • 相关阅读:
    生成函数学习笔记
    CF1437F Emotional Fishermen
    BZOJ 1443 [JSOI2009]游戏Game
    BZOJ 1018 [SHOI2008]堵塞的交通traffic
    访问量破1000之记录
    BZOJ 1022 [SHOI2008]小约翰的游戏John
    BZOJ1457 棋盘游戏
    BZOJ1874: [BeiJing2009 WinterCamp]取石子游戏
    BZOJ 1188 [HNOI2007]分裂游戏
    Codeforces Round #345 (Div. 2)
  • 原文地址:https://www.cnblogs.com/cdp-snail/p/4947393.html
Copyright © 2011-2022 走看看