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

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

这是我的问题:

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

最佳答案

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

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

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

@cocoafan,我认为您可能是在NSProxy之上从头开始创建此对象的正确方法,但是请仔细阅读NSConnection并查看是否可以对其进行子类化以按所需方式管理网络连接。如果您能找到一种方法来做到这一点(尽管我看不到一个简单的方法),您可能会从NSDistantObject免费获得很多东西。

09-13 05:31