개체에 전달 된 메시지를 캡처하기 위해 NSProxy, forwardInvocation 등을 설정했습니다. 정상적으로 작동합니다.self-possible으로 forwardInvocation을 사용하는 NSProxy?
내가 뭘하고 싶은지 여부는 자기가 전달한 메시지를 캡처하는 것입니다 : [self doSomething] or self.myVal = 5;
작동하지 않는 것 같습니다 ... 가능합니까?
개체에 전달 된 메시지를 캡처하기 위해 NSProxy, forwardInvocation 등을 설정했습니다. 정상적으로 작동합니다.self-possible으로 forwardInvocation을 사용하는 NSProxy?
내가 뭘하고 싶은지 여부는 자기가 전달한 메시지를 캡처하는 것입니다 : [self doSomething] or self.myVal = 5;
작동하지 않는 것 같습니다 ... 가능합니까?
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
(프록시) 클래스의 인터페이스에서 메소드를 감지 할 수 없으며 실제로 이것이 다른 클래스의 프록시라는 것을 알기에 충분히 똑똑하지 않으므로 오류가 발생합니다.
질문에 답변 했습니까? –
이론적으로 그렇다! 비록 그것을 밖으로 시도 할 기회가 없었어요. – akbsteam