首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSProxy和forwardInvocation:

使用NSProxy和forwardInvocation:
EN

Stack Overflow用户
提问于 2009-06-01 21:50:00
回答 3查看 2.7K关注 0票数 5

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

问题是子类NSProxy和重写forwardInvocation:是不够的。我还必须重写methodSignatureForSelector

以下是我的问题:

代码语言:javascript
复制
– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return ??? 
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-09 23:37:52

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

票数 0
EN

Stack Overflow用户

发布于 2009-06-01 22:58:49

@Brian,这可能是可以的,但是setProtocolForProxy:只是为了优化。cocoafan可以为他的解决方案委托它,但它不会是一种替代。你应该能自动获得签名。为此,网络协议需要一种请求签名的方法。

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

如果要经常聊天,提供setProtocolForProxy:是一个重要的优化,但它确实限制了您只使用有协议的对象,并且在10.5之前引入了一些恼人的限制(所有的方法都是必需的)。即使在10.5中,如果方法签名是获得方法签名的唯一方法,也可能会带来一些问题限制。

@cocoafan,我认为在NSProxy之上从头开始创建它可能是正确的,但是请看一下NSConnection,看看是否可以将其子类化,以便以您想要的方式管理网络连接。如果您能够找到一种方法(尽管我不认为这是一种简单的方法),那么您可能会从NSDistantObject免费获得很多东西。

票数 2
EN

Stack Overflow用户

发布于 2009-06-01 22:38:21

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/936976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档