5

我想编写一个代理,通过 TCP 将方法调用转发到另一个对象,而无需 NSConnection其他东西NSDistanceObject。我想要的是我自己的协议。

问题是子类化 NSProxy 和覆盖forwardInvocation:是不够的。我也必须覆盖methodSignatureForSelector

这是我的问题:

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

3 回答 3

2

@Brian,这可能没问题,但这setProtocolForProxy:只是为了优化。cocoafan 可以为他的解决方案强制使用它,但它不会是替代品。您应该能够自动获得签名。为此,网络协议需要一种请求签名的方法。

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

setProtocolForProxy:如果您要经常喋喋不休,提供是一项重要的优化,但它确实将您限制在您拥有协议的对象上,并且在 10.5 之前引入了一些烦人的限制(所有方法都是必需的)。即使在 10.5 上,如果它是获取方法签名的唯一方法,它也可能会引入一些有问题的限制。

@cocoafan,我认为您在 之上从头开始创建它可能是正确的NSProxy,但请看一下NSConnection,看看您是否可以对它进行子类化以按照您想要的方式管理网络连接。如果你能找到一种方法来做到这一点(虽然我没有看到一个简单的方法),你可能会从NSDistantObject.

于 2009-06-01T22:58:49.863 回答
1

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

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

于 2009-06-01T22:38:21.073 回答
0

我找到了一个生成对象的智能解决方案。NSInvocation

于 2009-06-09T23:37:52.303 回答