2012-09-06 2 views
1

개체에 전달 된 메시지를 캡처하기 위해 NSProxy, forwardInvocation 등을 설정했습니다. 정상적으로 작동합니다.self-possible으로 forwardInvocation을 사용하는 NSProxy?

내가 뭘하고 싶은지 여부는 자기가 전달한 메시지를 캡처하는 것입니다 : [self doSomething] or self.myVal = 5;

작동하지 않는 것 같습니다 ... 가능합니까?

+0

질문에 답변 했습니까? –

+0

이론적으로 그렇다! 비록 그것을 밖으로 시도 할 기회가 없었어요. – akbsteam

답변

2

self 또는 프록시를 가리키는 다른 변수를 통해 프록시 인스턴스에 메시지를 보내면 아무런 차이가 없습니다. 후드에서 각 메시지 디스패치는 objc_msgSend() 함수 호출로 변환되어 인스턴스의 주소를 수신기로 전달하므로 실제로 각자 자신 또는 "외부 변수"를 사용하는 경우 문제가되지 않습니다. 같은 대상.

NSProxy 서브 클래스 (TestProxy)를 NSObject 하위 클래스 (TestObject)로 전달하여 테스트했습니다. TestObject 한 정의에있어서, 상기 오브젝트의 설명을 인쇄했다 :

@interface TestObject : NSObject 
- (void)printDescription; 
@end 

프록시 갖는다 재정의 다음 방법 (_theObject가 프록시되는 TestObject 인스턴스이다)

- (void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    SEL selector = [anInvocation selector]; 

    if ([_testObject respondsToSelector:selector]) 
     [anInvocation invokeWithTarget:_testObject]; 
} 

- (BOOL)respondsToSelector:(SEL)aSelector 
{ 
    return [_testObject respondsToSelector:aSelector]; 
} 

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector 
{ 
    return [_testObject methodSignatureForSelector:selector]; 
} 

에 printDescription 메시지 보내기 self을 통해 프록시는 제대로 _theObject에 메시지 호출 전달 :

이 문제는 컴파일러가 제공되었다
[((id)self) printDescription]; 

있음을 경우를 요 당신이 id에 캐스팅하지 않고 직접 self에 메시지를 보내려고하면 오류가 발생합니다. 그럴 것 같아요. 컴파일러는 self (프록시) 클래스의 인터페이스에서 메소드를 감지 할 수 없으며 실제로 이것이 다른 클래스의 프록시라는 것을 알기에 충분히 똑똑하지 않으므로 오류가 발생합니다.