9
@property (atomic, retain) NSArray *array;

配列のセッターとゲッターをオーバーライドしません。@synchronized(array){} または @synchronized(self.array){} を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいですか?

4

2 に答える 2

12

を使用@syncrhonized(obj)すると、同期している他のコードobjが同時に実行されないようにロックが形成されます。

アトミック プロパティは、プロパティへのアクセス中に変更を許可しないことで機能します。アクセスに対して暗黙的なロックを提供します。

array = someObject.array; //locked
[array doSomething];      //no longer locked

atomicプロパティのgetter と setter をオーバーライドすることはできませんが@sycnronized、getter/setter の周りにディレクティブを使用するだけで十分です。

@synthesize array=_array;

...

-(void)setArray
{
    @synchronized(self) 
    {
        _array = array;
    }
}

-(NSArray *)array
{
    NSArray *retVal;

    @synchronized(self) 
    {
        retVal = _array;
    }

    return retVal;
}

正直なところ、本格的なマルチスレッド プログラミングを行っていない限り、アトミック プロパティは不要であり、パフォーマンス ヒットを引き起こすだけです。

于 2012-05-08T16:23:41.533 に答える
9

質問を表現したように、両方のステートメントは、同時実行の安全戦略の問題として同等です。

プロジェクトの規模と作業の完了度によっては、スレッド セーフのための別の戦略を検討することをお勧めします。

最近、Apple は、従来のブロッキングではなく、シリアル化によるスレッド セーフを推奨することを強調しました。要するに、競合が増えると、シリアル化されたアクセスは @synchronize でブロックするよりもはるかに効率的になります。

同期するのではなく、GCD シリアル キューを設定し、スレッド間で共有されるリソースへのアクセスをキューに入れることを検討してください。

于 2012-05-08T16:31:21.037 に答える