2011-01-11 12 views
21

私はいくつかの外国のコードで何かを読んでいると私は私の仮定をチェックしたい:@synchronized(self)は、プロパティで自己プレフィックスが不要なブロックを作成しますか?

@synchronized(self)は、プロパティを設定するときself接頭辞を取り除くために使用されています。

私の例では、ローカル変数だけでなく、インスタンスのstrTextを設定しています。

- (void)myfunction{ 
    NSString * strText = @"var in function"; 
    @synchronized(self) 
    { 
     strText = @"var class (self.strText)"; 
    } 

} 

答えて

39

@synchronized()ディレクティブは 単一のスレッドで使用するためのコードのセクションをロックし、このDocumentation

をお読みください。スレッドが 保護されたコードを終了するまで、つまり実行が@synchronized()ブロック内の最後の ステートメントを過ぎて継続するまで、他のスレッドはブロックされます。

@synchronized()ディレクティブは、唯一の引数として selfを含むObjective-Cオブジェクトをとります。

Massimo Cafaro pointed out通り: 「アプリケーションが競合状態を避けるために、マルチスレッドになる前には、すべての相互排他オブジェクトを作成するのが最も安全です。」

+2

ドキュメントのリンクは廃止されました。これを参照してください: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – cescofry

+0

@cescofry、はい、そのリンクは古くなっていました。あなたの与えられたリンクで自分の答えを更新します。ありがとう。 – Tirth

8

@synchronized(self)は、自己を取り除くために使用されます。接頭辞。

私の例では、私は クラスで設定した関数にstrTextを設定しません。

2つのコンセプトが統合されています。

  1. @synchronized(self) { ... }は、selfオブジェクトをセマフォとして使用してブロックをロックします。
  2. Objective-Cでは、他の言語と同様に仮想withのようなものはありません。self.whateverのほうがwhateverである必要がなくなります。スタンフォードCS193Pオンラインコースを受験して、その言語をブラッシュアップされることもあります。
+7

なぜこの回答ですか?それは質問に「答える」かもしれませんが、違反はありません。 –

+5

@synchronizedは、 "self"が必要かどうかに影響しません。接頭辞。彼らは決して無関係です。 –

+2

これは、@Mattの質問の誤解に実際に取り組む3人の唯一の答えです。他の2つは、 '@synchronized()'についての文書をちょうどparrotします。 –

関連する問題