在Objective-C中使用`oneway void`的用例?

时间:2011-03-31 03:18:22

标签: objective-c syntax keyword use-case

我在NSObject.h中找到了一个奇怪的关键字

- (oneway void)release;

我搜索了网络,并了解到它与异步消息传递有关,它与Erlang的消息传递类似。

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

3 个答案:

答案 0 :(得分:108)

oneway与分布式对象API一起使用,允许在不同的线程或应用程序之间使用objective-c对象。它告诉系统在方法返回之前它不应该阻塞调用线程。没有它,调用者将阻塞,即使方法的返回类型为void。显然,它永远不会与void之外的任何东西一起使用,因为这样做意味着该方法返回一些东西,但是调用者没有得到它。

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

答案 1 :(得分:38)

似乎有必要使用XCode 4.2(LLVM)消除警告。具体做法是:

-(void) release { }

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

  

警告:语义问题:在'release'的实现中返回类型上的分布式对象修饰符冲突

可以通过添加单向修改器来消除警告:

-(oneway void) release { }

这是在单例的实现,所以发布真的没有做任何事情。

这对于iOS和OS X来说是必要的(至少要消除警告)。即使iOS中没有分布式对象,iOS文档中的NSObject协议也将发布定义为(单向无效)。似乎LLVM选择了这个,而GCC没有。

答案 2 :(得分:18)

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

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

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