Objective-C中 `oneway void` 的使用场景是什么?

112

我在NSObject.h中发现了一个奇怪的关键字

- (oneway void)release;

我在网上搜索了一下,得知它与异步消息传递有关,这似乎与Erlang的消息传递相似。

看起来这可以做很多有趣的事情。你能给出一些这个关键字的好用例吗?


6
易于记忆的编程术语 "oneway void" 是编程中有时会出现的一种美丽的意外隐喻,代表着死亡。"如果在另一边有什么东西,请不要告诉我们。" - buildsucceeded
2个回答

114
oneway 被用于分布式对象API中,它允许在不同的线程或应用程序之间使用Objective-C对象。它告诉系统在方法返回前不应该阻塞调用线程。如果没有它,调用者会被阻塞,即使方法的返回类型是void。显然,除了void以外,它从未与其他任何东西一起使用,因为这样做意味着方法返回了某些内容,但调用者无法获取它。
有关分布式对象的更多信息,请参见Cocoa概念DistrObjects

6
这个链接似乎已经失效了。我在苹果的文档中找不到它,但我找到了一个网站:http://chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf ,其中提供了“oneway”关键字的很好解释。请参见第4.4.5节(pdf第24页)。 - jlmendezbonini
@Robin 谢谢你的更新。它在过去几个月里消失了,但我没有找到苹果的其他参考资料,所以我就放着了。 - ughoavgfhw
我曾认为唯一启动网络任务的方法是将它们放在子线程中...使用gcd_async及其相关函数.. - Nirav Bhatt

21
根据苹果的文档,oneway 仅用于分布式对象(而不是用于多线程)。
如果对象是远程的,则只使用 oneway 修饰符。在这种情况下,释放调用可以异步返回(在方法终止之前)。在网络中,这是有意义的,因为等待返回消息可能需要一段时间。
release 方法没有返回值,因此可以异步执行调用。相反,retain 和autorelease 返回 id,因此我们必须等待返回消息在整个网络中传输。

我有一个相关的问题:如果使用oneway关键字会导致消息在调用方法执行时不阻塞调用线程,那么被调用的方法将在第二个线程上执行。这不是最简单形式的多任务吗?我能否使用它将一些操作快速(不费力)地分离到另一个线程中?非常感谢。 - Constantino Tsarouhas
2
不行,分布式计算中线程在不同的机器/进程中执行。你可以使用performSelector: onThread: withObject: waitUntilDone:来实现你的目的。 - Freeman
2
那么 - (oneway void) release 是怎样的情况呢?它不在另一台机器或进程中。 - Constantino Tsarouhas
将“单向”定义为方法的一种方式,意味着“不等待方法完成并返回任何内容。如果存在任何网络流量等情况,请阻止它。”我解释得清楚吗? - geekay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接