메소드 스위 즐링을 사용하여 일부 추가 기능을 사용하여 클래스의 모든 메소드 호출을 래핑했습니다. 특히 나는이었다 프록시가있는 클래스의 내부 호출이 프록시를 통해 라우트되지 않습니다.
- 캐시 해당 개체가 반환 한 경우,이 메소드 호출에 필요한 객체가 캐시
- 에 있다면 확인.
- 그렇지 않은 경우 원래 구현으로 보내고 캐시를 채우고 반환합니다.
NSProxy를 사용하면 더 읽기 쉬운 코드가 제공되는지 알기를 원했고, NSProxy는 알 수없는 인수가있는 메서드 호출을 쉽게 리디렉션 할 수 있다고 생각했습니다.
따라서 NSProxy 버전은 중요한 캐치를 제외하고는 잘 작동합니다. 내 하위 클래스의 모든 내부 호출은 프록시를 통해 전달되지 않습니다.
- (id)init
{
self = [super init];
if (self)
{
TyphoonAssemblyProxy* proxy = [[TyphoonAssemblyProxy alloc] initWithAssembly:self];
self = proxy; // 'self' should now be the proxy. . . but it seems not :(
}
return self;
}
내부 호출 (즉, 프록시 클래스 내에서 '자기'호출) 프록시를 통해 라우팅되지 않습니다 :
다음내가 독립의 인터셉터를 만드는 방법
이제 프록시 클래스를 사용하는 하위 클래스에서 내부 호출이 프록시를 통해 전달되도록 코드를 작성해야합니다. 그러나 그들은 그렇지 않습니다.
- (id)knight
{
return [TyphoonDefinition withClass:[Knight class] properties:^(TyphoonDefinition* definition)
{
//THIS NEXT CALL TO [self defaultQuest] SHOULD GO THROUGH PROXY MACHINERY!
[definition injectProperty:@selector(quest) withDefinition:[self defaultQuest]];
[definition injectProperty:@selector(damselsRescued) withValueAsText:@"12"];
[definition setScope:TyphoonScopeDefault];
}];
}
질문 :
이 내부 얻을 수있는 가장 쉬운 방법 프록시를 통해 이동 이동은 무엇입니까?
이 작업을 수행해야 할 수 있습니다. 현재 우리는 스위 즐링 (swizzling)으로 인터셉트/AOP- 같은 행동을하고 있습니다. 그러나 우리는 임의의 수의 인수를 포착하여 구현에 전달하려고합니다. va_args를 사용하고 있었지만 arm64에서는 레지스터로 직접 이동했습니다. . (연기가 나옴). 포워딩 스타일은 이런 일이 잘 작동하는 NSInvocation을 제공합니다. –