@property (atomic, retain) NSArray *array;
配列のセッターとゲッターをオーバーライドしません。@synchronized(array){} または @synchronized(self.array){} を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいですか?
@property (atomic, retain) NSArray *array;
配列のセッターとゲッターをオーバーライドしません。@synchronized(array){} または @synchronized(self.array){} を使用できます。私はすべてのケースが正しいことを知っているので、私は正しいですか?
を使用@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;
}
正直なところ、本格的なマルチスレッド プログラミングを行っていない限り、アトミック プロパティは不要であり、パフォーマンス ヒットを引き起こすだけです。
質問を表現したように、両方のステートメントは、同時実行の安全戦略の問題として同等です。
プロジェクトの規模と作業の完了度によっては、スレッド セーフのための別の戦略を検討することをお勧めします。
最近、Apple は、従来のブロッキングではなく、シリアル化によるスレッド セーフを推奨することを強調しました。要するに、競合が増えると、シリアル化されたアクセスは @synchronize でブロックするよりもはるかに効率的になります。
同期するのではなく、GCD シリアル キューを設定し、スレッド間で共有されるリソースへのアクセスをキューに入れることを検討してください。