22

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

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

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

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

}
4

3 に答える 3

41

このドキュメントをお読みください

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

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

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

于 2011-01-11T05:26:39.833 に答える
0

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

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

+(id)getSingletonInstance
{
    @synchronized(self)
    {
        if (singletonObj == nil)
        {
            singletonObj = [[self alloc] init];
        }
        return singletonObj;
    }
}
于 2019-01-29T06:39:45.280 に答える