マルチスレッドプログラミングに関する簡単な質問:NSMutableArrayインスタンス変数がメインスレッドによって読み込まれ、別のスレッドによって設定されています。私は現在、これを使用しています:ここでは「アトミック」は必要ですか?
@property (nonatomic, retain) NSMutableArray *locations;
しかし、私は "非原子"指示を今削除する必要があると思いますか?
マルチスレッドプログラミングに関する簡単な質問:NSMutableArrayインスタンス変数がメインスレッドによって読み込まれ、別のスレッドによって設定されています。私は現在、これを使用しています:ここでは「アトミック」は必要ですか?
@property (nonatomic, retain) NSMutableArray *locations;
しかし、私は "非原子"指示を今削除する必要があると思いますか?
新しい配列を作成してそれを場所に割り当てると、アトム属性が必要になります。
他のスレッドからロケーションオブジェクトを追加/削除する場合、配列のアトミック属性は適用されません。さまざまなNSMutable ...コレクションは、add/insert/removeメソッドが複数のスレッドから呼び出されるように設計されていないため、スレッドセーフではありません。
参照SOの質問:NSMutableDictionary thread safety
は、より良いアプローチは、他のスレッドは変更が唯一のメインスレッド上で発生するように追加または削除するには、メインスレッドに場所の配列を送信持っているかもしれません。
"非原子的"はスレッドセーフではありません。このSO質問チェックアウト:
iPhone SDK Nonatomic and Atomic
これは、ほとんどの状況に、あなたは非アトミックとして財産を残すことで問題はありません。私は原子を使う必要はほとんどありません。私のアプリケーションはすべて、ある種のマルチスレッドを使用しています。
正しいアプローチIMOは、コードをプロファイリングすることによって明らかにされるような実証可能なパフォーマンスの問題がない限り、すべてのプロパティをアトミックにします。
しかし、NSMutableArrayスレッドの内部状態を安全にするために、アトミックなアトミックなものを作成すると、になるため、この例では役に立ちません。プロパティーの原子をに、に、あるスレッドがアレイの変更(つまりオブジェクトの追加または削除)を停止するための同期を導入する必要があります。これは強制するのが非常に難しいので、おそらくプロパティとして配列を公開しないでしょう。私のような親オブジェクトの何かの方法があるだろう:
-(void) addLocation: (id) newLocation;
-(id) locationAtIndex: (NSUInteger) index;
などNSMutableArrayの方法に類似し、それらはすべて同期させることだろう。配列全体を返すプロパティがあった場合、それは読み取り専用であり、実際の配列の不変のコピーを返します。