web-dev-qa-db-ja.com

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

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

- (oneway void)release;

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

これにより多くの興味深いことができるようです。このキーワードの良い使用例は何ですか?

105
Eonil

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

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

108
ughoavgfhw

また、XCode 4.2(LLVM)で警告を排除する必要があるようです。具体的には:

-(void) release { }

xCode 4.2(LLVMを使用)で次の警告が表示されます。

警告:意味上の問題: 'release'の実装での戻り値の型の分散オブジェクト修飾子の競合

警告はoneway修飾子を追加することで除去できます:

-(oneway void) release { }

これはシングルトンの実装にあるため、リリースは実際には何もしません。

これはiOSとOS Xで(少なくとも警告を排除するために)必要です。iOSドキュメントのNSObjectプロトコルは、iOSに分散オブジェクトがなくてもリリースを(一方的に無効)と定義しています。 LLVMはこれを選択しますが、GCCはそうではないようです。

38
jeffc666

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

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

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

18
Freeman