Objective-C中“单向无效”的用例?


107

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

- (oneway void)release;

我在网上搜索,发现它与异步消息传递有关,该消息看起来与Erlang的消息传递相似。

看来这可以使很多有趣的事情。此关键字有哪些好的用例?


5
容易记住:这oneway void是我们有时在编码中有时会看到的那些美丽的偶然隐喻之一,在这种情况下是死亡。“如果另一边有任何东西,请不要告诉我们。”
成功

Answers:


111

oneway与分布式对象API一起使用,该API允许在不同线程或应用程序之间使用Objective-C对象。它告诉系统在方法返回之前,它不应阻塞调用线程。没有它,即使方法的返回类型为void,调用方也将阻塞。显然,除了void之外,它永远不会与其他任何东西一起使用,因为这样做将意味着该方法返回某些内容,但调用者未获取它。

有关分布式对象的更多信息,请参见Cocoa Conceptual DistrObjects


6
该链接似乎不再起作用。我在Apple的文档中找不到它,但是我发现:chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf,它很好地解释了“单向”关键字。参见4.4.5节(pdf第24页)
jlmendezbonini 2011年

@Robin感谢您的更新。在过去的几个月里它消失了,但是我找不到苹果的其他参考,所以我就离开了。
ughoavgfhw 2011年

而且我认为触发网络任务的唯一方法是使用gcd_async及其朋友对它们进行子线程处理。–
Nirav Bhatt,

18

根据Apple的文档,单向仅用于分布式对象(而不用于多线程)。

仅当对象是远程对象时,才使用单向修饰符。在这种情况下,释放调用可以异步返回(在方法终止之前)。在网络中这很有意义,因为等待返回消息可能需要一段时间。

release方法没有返回值,因此调用它可以异步执行。相反,retain和autorelease返回一个id,因此我们必须等待该返回消息在整个网络中传输。


我有一个相关的问题:如果使用oneway关键字导致消息在执行被调用方法时不阻止调用线程,则使被调用方法在第二个线程上执行。那不是多任务处理(以最简单的形式)吗?我可以使用它来快速(无需费力)将一些小的操作分离到另一个线程吗?非常感谢你。
康斯坦丁诺·萨鲁哈斯

1
不,你不能。在分布式计算中,线程在不同的机器/进程中执行。您可以根据需要使用performSelector:onThread:withObject:waitUntilDone:。
Freeman

2
那么那会发生什么- (oneway void) release呢?它不在另一台机器或进程上。
君士坦丁·萨鲁哈斯

+1解释一种确切的方法是什么->定义one way一种方法意味着 don't wait for the method to complete and return anything. block it if there is any n/w trafic or so. 我有意义吗?
thesummersign
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.