我想编写一个代理,该代理将方法调用转发到另一个没有NSConnection和NSDistanceObject的对象。我想要的是我自己的协议。
问题是子类NSProxy和重写forwardInvocation:是不够的。我还必须重写methodSignatureForSelector
以下是我的问题:
– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
return ???
}发布于 2009-06-09 23:37:52
我找到了一个智能解决方案来生成NSInvocation对象。
发布于 2009-06-01 22:58:49
@Brian,这可能是可以的,但是setProtocolForProxy:只是为了优化。cocoafan可以为他的解决方案委托它,但它不会是一种替代。你应该能自动获得签名。为此,网络协议需要一种请求签名的方法。
我认为这里的解决方案是在网络协议中包含一个“请求方法签名”方法,并让它在远程对象上运行methodSignatureForSelector:并对结果进行编码和返回。这就是NSDistantObject所做的。
如果要经常聊天,提供setProtocolForProxy:是一个重要的优化,但它确实限制了您只使用有协议的对象,并且在10.5之前引入了一些恼人的限制(所有的方法都是必需的)。即使在10.5中,如果方法签名是获得方法签名的唯一方法,也可能会带来一些问题限制。
@cocoafan,我认为在NSProxy之上从头开始创建它可能是正确的,但是请看一下NSConnection,看看是否可以将其子类化,以便以您想要的方式管理网络连接。如果您能够找到一种方法(尽管我不认为这是一种简单的方法),那么您可能会从NSDistantObject免费获得很多东西。
发布于 2009-06-01 22:38:21
NSDistantObject处理这一问题的方式是它的setProtocolForProxy:方法,它指定了一个协议,该协议包含连接另一端的对象处理的方法列表。然后,在进行转发时,它可以使用这些方法的信息提供适当的NSMethodSignature对象。
看起来最简单的方法是通过protocol_getMethodDescription()函数(在<objc/runtime.h>中声明)。这将返回一个objc_method_description结构,其中包含一个types字段。我相信您应该能够将该值传递给+[NSMethodSignature signatureWithObjCTypes:],以获得一个与协议中声明的内容匹配的方法签名对象。
https://stackoverflow.com/questions/936976
复制相似问题