Внутренние звонки в моем прокси-классе не маршрутизируются через прокси

Я использовал метод swizzling, чтобы обернуть все вызовы метода в классе с некоторыми дополнительными функциями. Конкретно я был:

  • Проверка, был ли требуемый объект для этого вызова метода в кеше
  • Если кеш имел этот объект, верните его.
  • Если нет, отправьте в исходную реализацию, заполните кеш и верните его.

Я хотел посмотреть, дает ли использование 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;
}

Внутренние вызовы (то есть вызовы 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 ответ

Решение

Вместо этого, возможно, вам подойдет пересылка сообщений.

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

Другие вопросы по тегам