Objective-C中“oneway void”的用例

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

- (oneway void)release; 

我search了网页,发现它与asynchronous消息传递有关,这与Erlang的消息传递很相似。

看来这可以做很多有趣的事情。 什么是这个关键字的一些很好的用例?

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

有关分布式对象的更多信息,请参阅Cocoa概念性分布图 。

XCode 4.2(LLVM)似乎也需要消除警告。 特别:

 -(void) release { } 

在XCode 4.2(带有LLVM)中给出以下警告:

警告:语义问题:在“释放”的实现中,在返回types上发生冲突的分布式对象修饰符

警告可以通过添加单向修饰符来消除:

 -(oneway void) release { } 

这是在一个单身人士的实施,所以释放真的什么都不做。

这是必要的(至less消除警告)在iOS和OS X. iOS文档中的NSObject协议将释放定义为(oneway void),即使在iOS中没有分布式对象。 看来,LLVMselect了这个,而海湾合作委员会没有。

根据苹果的文档,单向仅用于分布式对象(而不是multithreading)。

单向修饰符仅用于对象是远程的。 在这种情况下,释放调用可以asynchronous返回(在方法终止之前)。 在networking中它是有道理的,因为等待返回消息可能需要一段时间。

release方法没有返回值,所以调用它可以asynchronous执行。 相反,保留和autorelease返回一个id,所以我们必须等待返回消息在整个networking中传输。