【问题标题】:Internal calls on my proxied class don't get routed through proxy我的代理类的内部调用不会通过代理路由
【发布时间】:2013-08-18 04:27:15
【问题描述】:

我使用方法调配将所有方法调用包装在一个具有一些额外功能的类中。具体来说,我是:

  • 检查此方法调用所需的对象是否在缓存中
  • 如果缓存中有该对象,则返回它。
  • 如果没有,则分派到原始实现,填充缓存并返回。

我想看看使用 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];
    }];
}

问题:

通过代理获取这些内部消息的简单方法是什么?

【问题讨论】:

    标签: objective-c objective-c-runtime nsproxy


    【解决方案1】:

    【讨论】:

    • 我们可能不得不这样做。目前,我们使用 swizzling 进行拦截/类似 AOP 的行为。但是,我们希望捕获任意数量的参数并分派给一个实现。正在使用 va_args,但在 arm64 上,它们直接进入寄存器和。 . (冒烟)。 Forwarding-style 提供了一个 NSInvocation ,这种事情可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2019-10-26
    • 2021-09-10
    • 2017-10-05
    • 2013-12-24
    相关资源
    最近更新 更多