Effective Objective-C 2.0-12조: 메시지 전달 메커니즘 이해

2433 단어
11조 대상의 메시지 전달 메커니즘을 설명했다
12개 설명 대상이 해석할 수 없는 소식을 받은 후 무슨 일이 발생하면'메시지 전송'(message forwarding) 메커니즘을 시작합니다.
4
  • 대상이 어떤 선택 항목에 응답하지 못하면 메시지 전달 절차에 들어간다

  • 4
  • 1 운행기의 동적 방법 해석 기능을 통해 특정한 방법이 필요할 때 이를 클래스에 추가할 수 있다

  • 4
  • 2 대상은 해석할 수 없는 일부 선택자를 다른 대상에게 전달하여 처리할 수 있다

  • 4
  • 상기 두 단계를 거친 후에도 선택자를 처리할 수 없다면 완전한 메시지 전달 메커니즘을 가동한다

  •  

    동적 방법 해석


    대상은 판독할 수 없는 소식을 받은 후, 우선 그 소속 클래스의 아래의 클래스 방법을 호출한다
    + (BOOL)resolveInstanceMethod:(SEL)selector

    반환 값은 BOOL입니다. 이 클래스가 이 선택을 처리하는 데 사용할 실례를 추가할 수 있는지 여부를 나타냅니다.     
    이런 방법을 사용하는 전제는 관련 방법의 실현 코드가 이미 작성되었고 운행할 때만 클래스에 동적으로 삽입하면 된다는 것이다.이 방안은 @dynamic 속성을 실현하는 데 자주 사용됩니다. 예를 들어CoreData 프레임워크의 NSManagedObjects 대상의 속성에 접근할 때 이렇게 할 수 있습니다. 이러한 속성을 실현하는 데 필요한 접근 방법은 컴파일링 기간에 확정될 수 있기 때문입니다.
    다음 코드는 @dynamic 실행을'resolveInstanceMethod'로 하는 방법을 보여 줍니다.
    id  autoDictionaryGetter(id self, SEL _cmd); void    autoDictionarySetter(id self, SEL _cmd, id value); + (BOOL)resolveInstanceMethod:(SEL)selector { NSStirng *selectorString = NSStringFromSelector(selector); if (/*selector is from a @dynamic property */) { if ([selectorString hasPerfix:@"set"]) { class_addMethod(self, selector, (IMP)autoDictionarySetter, "v@:@"); } else { class_addMethod(self, selector, (IMP)autoDictionaryGetter, "@@:"); } return YES; } } return [super resolveInstanceMethod:selector]; }

    우선 선택자를 문자열로 바꾸어 설정 방법을 표시하는지 확인합니다.

    지원 수용자

    - (id)forwardingTargetForSelector:(SEL)selector

    전체 메시지 전달


    먼저 NSInvocation 객체를 만들고 처리되지 않은 메시지와 관련된 모든 세부 사항을 봉합니다.이 대상은 selector, target, 그리고 파라미터가 NSInvocation 대상을 터치할 때 메시지 발송 시스템 (message-dispatch system) 이 직접 나서서 메시지를 목표 대상에게 파견합니다.
    - (void)forwardInvocation:(NSInvocation *)invocation

     

    메시지 전달 전체 프로세스


    완전한 예로 동적 방법의 해석을 보여 주다


    좋은 웹페이지 즐겨찾기