Objective-Cでの「oneway void」の使用例?


107

NSObject.hで奇妙なキーワードを見つけました

- (oneway void)release;

私はWebを検索し、それが非同期メッセージパッシングに関連していることを学びました。これは、Erlangのメッセージパッシングと似ています。

これは多くの興味深いものを作ることができるようです。このキーワードの良いユースケースは何ですか?


5
覚えやすい:これoneway voidは、コーディングの際にときどき見られる美しい偶発的な比喩の1つで、この場合は死です。「反対側に何かがある場合は、教えないでください。」
ビルドは2013

回答:


110

oneway分散オブジェクトAPIとともに使用されます。これにより、異なるスレッドまたはアプリケーション間でObjective-Cオブジェクトを使用できます。これは、メソッドが戻るまで呼び出しスレッドをブロックしてはならないことをシステムに伝えます。これがないと、メソッドの戻り値の型が無効であっても、呼び出し元はブロックします。明らかに、それはvoid以外では決して使用されません。そうすると、メソッドが何かを返すことを意味しますが、呼び出し元はそれを取得しません。

分散オブジェクトの詳細については、Cocoa Conceptual DistrObjectsを参照してください。


6
リンクが機能していないようです。Appleのドキュメント内では見つかりませんでしたが、次のように見つけました:chachatelier.fr/programmation/fichiers/cpp-objc-en.pdfこれは、「一方向」キーワードの適切な説明を提供します。セクション4.4.5(pdf 24ページ)を参照してください
jlmendezbonini '26

@ロビンアップデートをありがとう。過去数か月間は使用されていませんでしたが、Appleからの別のリファレンスが見つからなかったため、そのままにしておきました。
ughoavgfhw 2011年

そして、私はgcd_asyncとその友人を使用して...火のネットワークタスクへの唯一の方法は、サブスレッド彼らにあると思っ...
Nirav Bhattさん

18

Appleのドキュメントによると、一方向は分散オブジェクトにのみ使用されます(マルチスレッドには使用されません)。

一方向修飾子は、オブジェクトがリモートの場合にのみ使用されます。この場合、リリースの呼び出しは非同期に戻ることができます(メソッドが終了する前に)。ネットワークでは、戻りメッセージを待つのにしばらく時間がかかることがあるため、理にかなっています。

releaseメソッドには戻り値がないため、非同期で実行できます。対照的に、retainとautoreleaseはIDを返すため、ネットワーク全体に戻りメッセージが転送されるのを待つ必要があります。


関連する質問onewayがあります。キーワードを使用すると、呼び出されたメソッドの実行中にメッセージが呼び出し側のスレッドをブロックしない場合、呼び出されたメソッドが2番目のスレッドで実行されます。そのマルチタスクではありませんか(最も単純な形で)?これを使用して、いくつかの小さな操作を別のスレッドにすばやく(それほど労力をかけずに)切り離すことができますか?どうもありがとうございました。
Constantino Tsarouhasが2011

1
いいえ、できません。分散コンピューティングでは、スレッドは別のマシン/プロセスで実行されます。目的に応じて、performSelector:onThread:withObject:waitUntilDone:を使用できます。
フリーマン

2
では、どうなるの- (oneway void) releaseでしょうか。別のマシンやプロセスにはありません。
コンスタンティーノツァロウは

正確に1つの方法について正確に説明するための+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 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.