我在NSObject.h中找到了一个奇怪的关键字
- (oneway void)release;
我搜索了网络,并了解到它与异步消息传递有关,它与Erlang的消息传递类似。
看来这可以做很多有趣的事情。这个关键字的一些好用例是什么?
答案 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,因此我们必须等待返回消息在整个网络中传输。