使用NSProxy和forwardInvocation:

时间:2009-06-01 21:50:00

标签: cocoa proxy selector invoke

我想编写一个代理,通过TCP 将方法调用转发给另一个对象,而不用 NSConnectionNSDistanceObject。我想要的是我自己的协议。

问题是继承NSProxy并覆盖forwardInvocation:是不够的。我还要覆盖methodSignatureForSelector

这是我的问题:

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}

3 个答案:

答案 0 :(得分:2)

@Brian,这可能没问题,但setProtocolForProxy:仅用于优化。 cocoafan可以为他的解决方案授权,但它不会成为替代品。你应该能够自动获得签名。为此,网络协议需要一种方法来请求签名。

我认为这里的解决方案是在网络协议中包含“请求方法签名”方法,并让它在远程对象上运行methodSignatureForSelector:并编码并返回结果。这就是NSDistantObject所做的。

如果你要喋喋不休地提供setProtocolForProxy:是一个重要的优化,但它确实会限制你拥有协议的对象,而10.5之前会引入一些令人讨厌的限制(所有方法都是需要)。即使在10.5上,如果它是获取方法签名的唯一方法,也可能会引入一些有问题的限制。

@cocoafan,我认为您可以在NSProxy之上从头开始创建这个,但是请查看NSConnection并查看是否可以对其进行子类化以管理网络连接的方式你想要的。如果你能找到一种方法(虽然我没有看到一个简单的方法),你可能会从NSDistantObject免费获得很多东西。

答案 1 :(得分:1)

NSDistantObject处理此问题的方式是setProtocolForProxy:方法,该方法指定一个协议,其中包含连接另一端的对象处理的方法列表。然后,它可以使用这些方法的信息在转发时提供适当的NSMethodSignature对象。

通过在protocol_getMethodDescription()中声明的<objc/runtime.h>函数,最直接的做法就是这样。这将返回包含objc_method_description字段的types结构。我相信你应该能够将该值传递给+[NSMethodSignature signatureWithObjCTypes:]以获得与协议中声明的内容相匹配的方法签名对象。

答案 2 :(得分:0)

我找到smart solution来生成NSInvocation个对象。