我想编写一个代理,通过TCP 将方法调用转发给另一个对象,而不用 NSConnection
和NSDistanceObject
。我想要的是我自己的协议。
问题是继承NSProxy并覆盖forwardInvocation:
是不够的。我还要覆盖methodSignatureForSelector
这是我的问题:
– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
return ???
}
答案 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
个对象。