Внутренние звонки в моем прокси-классе не маршрутизируются через прокси
Я использовал метод 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 ответ
Вместо этого, возможно, вам подойдет пересылка сообщений.