web-dev-qa-db-ja.com

@synchronized(self)は、プロパティに自己プレフィックスが不要なブロックを作成しますか?

私はいくつかの外国のコードで何かを読んだことがあり、私の仮定を確認したいと思います:

@synchronized(self)は、プロパティを設定するときにselfプレフィックスを取り除くために使用されます。

したがって、以下の例では、ローカル変数だけでなく、インスタンスのstrTextを設定していますよね?

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

}
22
endo.anaconda

これを読んでください ドキュメント

@synchronized()ディレクティブは、単一のスレッドで使用できるようにコードのセクションをロックします。他のスレッドは、スレッドが保護されたコードを終了するまで、つまり実行が@synchronized()ブロックの最後のステートメントを超えて続行されるまでブロックされます。

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

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

41
Tirth

@synchronized(self)は、自己を取り除くために使用されます。プレフィックス。

したがって、私の例では、クラスで設定した関数ではなく、strTextを設定しました。

2つの概念が混同されています。

  1. @synchronized(self) { ... }は、selfオブジェクトをセマフォとして使用する場合にのみブロックをロックします。
  2. Objective-Cでは、self.whateverを単にwithにする必要をなくす、他の言語のような架空のwhateverステートメントのようなものはありません。スタンフォードCS193Pオンラインコースを受講して、言語をブラッシュアップすることをお勧めします。
8
newacct

マルチスレッド環境では、複数のスレッドが同じメモリアドレスにアクセスしようとすると「競合状態」が発生する可能性があるため、このような状態を回避するには、「ミューテックスロック(相互排除)」を使用する必要があります。スレッドが同じメモリアドレスまたはコンテンツに同じ時点でアクセスし、一度に1つのスレッドのみを許可します。これは、@ synchronizedディレクティブを使用してObjectiveCで実現できます。

例:通常、シングルトンデザインパターンまたはクラスを実装している間、iOSプロジェクトで以下のようなコードスニペットが表示されます。

+(id)getSingletonInstance
{
    @synchronized(self)
    {
        if (singletonObj == nil)
        {
            singletonObj = [[self alloc] init];
        }
        return singletonObj;
    }
}
0
Suraj K Thomas