2013-08-18 2 views
2

메소드 스위 즐링을 사용하여 일부 추가 기능을 사용하여 클래스의 모든 메소드 호출을 래핑했습니다. 특히 나는이었다 프록시가있는 클래스의 내부 호출이 프록시를 통해 라우트되지 않습니다.

  • 캐시 해당 개체가 반환 한 경우,이 메소드 호출에 필요한 객체가 캐시
  • 에 있다면 확인.
  • 그렇지 않은 경우 원래 구현으로 보내고 캐시를 채우고 반환합니다.

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]; 
    }]; 
} 

질문 :

이 내부 얻을 수있는 가장 쉬운 방법 프록시를 통해 이동 이동은 무엇입니까?

답변

1
+0

이 작업을 수행해야 할 수 있습니다. 현재 우리는 스위 즐링 (swizzling)으로 인터셉트/AOP- 같은 행동을하고 있습니다. 그러나 우리는 임의의 수의 인수를 포착하여 구현에 전달하려고합니다. va_args를 사용하고 있었지만 arm64에서는 레지스터로 직접 이동했습니다. . (연기가 나옴). 포워딩 스타일은 이런 일이 잘 작동하는 NSInvocation을 제공합니다. –