iOS 메시지 전달

3273 단어
일반적으로 한 대상에게 메시지를 보내는데, 만약 이 대상이 이 메시지를 처리할 능력이 없다면 시스템은 오류를 보고할 것이다.그러나, 오류를 보고하기 전에,runtime 시스템은 이 대상에게 이 메시지를 처리할 기회를 줄 것이다.이 대상에게 forward Invocation: 메시지를 보냅니다. 이 메시지는 유일한 매개 변수가 있습니다. NS Invocation 대상입니다. 단지 NSObject의 forward Invocation: 방법은 Does Not Recognize Selector: 방법을 기본적으로 호출합니다. 방법은 Does Not Recognize Selector: 방법은 간단하게 이상을 던질 뿐입니다.메시지를 전달하기 위해 forwardInvocation: 방법은 다음과 같은 두 가지가 필요합니다.
  • 이 소식이 어디로 가야 할지 결정한다.
  • 원래 파라미터를 가지고 있는 이 메시지를 그곳에 보냅니다.
  • - (void)forwardInvocation:(NSInvocation *)anInvocation
    {
        if ([someOtherObject respondsToSelector: [anInvocation selector]])
         {
             [anInvocation invokeWithTarget:someOtherObject]; //                ,someOtherObject            。
         }
        else
         {
            [super forwardInvocation:anInvocation];
         }
    }
    

    forwardInvocation: 방법은 식별되지 않은 메시지 배달 센터의 역할을 맡고 있습니다.너는 이 방법에서 식별되지 않은 소식을 이 소식을 처리할 수 있는 대상에게 전달해야 한다.주의: 대상이 어떤 메시지에 응답하지 못할 때만 이 메시지는forwardInvocation: 에 도착합니다.예를 들어 당신의 대상이 다른 대상에게 negotiate 메시지를 전달하고 싶다면, 그 자체가 negotiate 메시지에 응답할 수 있는 negotiate 방법을 가지고 있을 수 없다.만약 그 자신이 이런 방법을 가지고 있다면, 이negotiate 메시지는 영원히 forward Invocation: 에 도착하지 않을 것이다.
    한 대상이 메시지를 전달해서'처리할 수 없을 것 같은'메시지에 도달할 수 있지만, -(BOOL)respondsToSelector:(SEL)aSelector 방법을 통해 이 방법은 여전히 NO로 되돌아온다.만약 당신의 대상을 다른 대상에게 계승하는 것처럼 보이고 싶다면, 예를 들어 양-(BOOL)respondsToSelector: (SEL)aSelector 방법을YES로 되돌려보내려면, 다시 쓰기-(BOOL)respondsToSelector: (SEL)aSelector 방법.
    - (BOOL)respondsToSelector:(SEL)aSelector
    {
        if ( [super respondsToSelector:aSelector] )
            return YES;
        else {
    
            /* Here, test whether the aSelector message can     *
    
             * be forwarded to another object and whether that  *
    
             * object can respond to it. Return YES if it can.  */
        }
    
        return NO;
    }
    

    다시 쓰는 방법과 비슷한 방법은 In addition to responds To Selector: and isKind OfClass:, the instances Respond To Selector: method should also mirror the forwarding algorithm.If protocols are used, the conformsToProtocol: method should likewise be added to the list.
    메시지를 전달하는 정확성을 확보하기 위해서methodSignatureForSelector: 방법을 다시 써야 합니다.
    - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
    {
        NSMethodSignature *signature = [super 
    methodSignatureForSelector:selector];
    
        if (!signature) {
           signature = [surrogate methodSignatureForSelector:selector];
        }
        return signature;
    }
    

    총괄적으로 메시지 전달은 상기 세 가지 방법을 다시 써야 한다.그 중에서methodSignatureForSelector:와forwardInvocation: 다시 써야 합니다.실행 순서는methodSignatureForSelector:그리고forwardInvocation:.forward Invocation만 다시 쓰기: 소용없습니다. 붕괴될 것입니다.대상이 어떤 방법을 처리할 수 없을 때, 다시 쓰기 - (NSMethodSignature*) methodSignatureForSelector: (SEL) selector가 있으면 시스템이 이 방법을 호출합니다.위 signature = [surrogate methodSignatureForSelector:selector];되돌아오는 것은nil입니다. 즉, 다른 대상도 이 방법을 울리지 못하면 forwardInvocation: 방법을 실행하기 전에 붕괴됩니다. forwardInvocation: 방법의 매개 변수는methodSignatureForSelector: 의 되돌아오는 값을 바탕으로 만들어졌기 때문입니다.
    다시 쓰는 방법, 사인하는 방법이 무슨 소용이 있습니까?- (NSMethodSignature *)methodSignatureForSelector:(SEL)selmethodSignatureForSelector 리셋을 통해 다른 대상이 전송될 메시지에 정말 응답할 수 있는지 미리 판단할 수 있습니다.NO로 돌아가면 forward Invocation: 방법을 실행하지 않아도 됩니다.
    메시지 전달을 통해 간단한 붕괴 방지를 할 수 있다.예를 들어 NSArray를 다시 쓰는 방법.

    좋은 웹페이지 즐겨찾기