2009-06-01 3 views
5

을 통해 다른 메서드에 메서드 호출을 전달하는 코드를NSConnectionNSDistanceObject없이 코딩하고 싶습니다. 내가 원하는 건 내 자신의 프로토콜이다.NSProxy 및 forwardInvocation 사용 :

문제는 NSProxy를 서브 클래 싱하고 forwardInvocation:을 오버라이드하는 것으로 충분하지 않다는 것입니다. 내가 여기 methodSignatureForSelector

를 오버라이드 (override) 할 수도있는 것은 내 질문은 :

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 
{ 
    return ??? 
} 

답변

1

방법 NSDistantObject이이 방법의 목록을 포함하는 프로토콜을 지정의 setProtocolForProxy: 방법입니다 처리하는의 다른 쪽 끝에있는 객체 연결 핸들. 그런 다음 전달할 때이 메서드에 대한 정보를 사용하여 적절한 NSMethodSignature 개체를 제공 할 수 있습니다.

에 선언 된 protocol_getMethodDescription() 함수를 사용하는 것이 가장 직관적 인 것처럼 보입니다. types 필드를 포함하는 objc_method_description 구조체가 반환됩니다. 나는 그 값을 +[NSMethodSignature signatureWithObjCTypes:]에 전달하여 프로토콜에서 선언 된 것과 일치하는 메소드 서명 객체를 얻을 수 있어야한다고 생각합니다.

2

@ 브라이언, 괜찮을 수도 있지만 setProtocolForProxy:은 최적화 용입니다. cocoafan은 자신의 솔루션에 위임 할 수 있지만 드롭 인 대체품이 아닙니다. 자동으로 서명을 얻을 수 있어야합니다. 그렇게하려면 네트워크 프로토콜에 서명을 요청하는 방법이 필요합니다.

여기 해결책은 네트워크 프로토콜에 "요청 메소드 서명"방법을 포함시키고 멀리있는 객체에 methodSignatureForSelector:을 실행하고 결과를 인코딩하고 반환하는 것입니다. 그것이 NSDistantObject입니다.

제공 많은 흥미를 갖게 될 경우 setProtocolForProxy:을 제공하는 것이 중요하지만 사용자가 프로토콜을 사용하는 개체로 제한하고 10.5 이전에는 몇 가지 귀찮은 제한을 도입했습니다 (모든 방법이 필요합니다). 10.5에서도 메소드 서명을 얻는 유일한 방법 인 경우 몇 가지 문제가 발생할 수 있습니다.

@cocoafan, 난 당신이 NSProxy 위에 처음부터이를 만들 아마 맞아 생각하지만, NSConnection 살펴보고 어떻게 당신이 하위 클래스 수는 네트워크 연결을 당신이 원하는 방식으로 관리 할 수 ​​있는지 확인합니다. 당신이 그것을 할 수있는 방법을 찾을 수 있다면 (나는 쉬운 방법이 보이지 않지만) NSDistantObject에서 무료로 많은 것을 얻을 수 있습니다.

+0

두 분 모두에게 감사드립니다. 나는 XML-RPC로 통신을 대체 할 것이다. NSConnection을 재정 의하여 이것이 가능하면 확실하지 않습니다. – cocoafan