NSArray
次のようにプロパティとして公開されるインスタンス変数を保持するアプリ (GC ではなく保持/リリースを使用) があります。
@interface MyObject : NSObject
{
NSArray* myArray;
}
@property (copy) NSArray* myArray;
@end
を使用して切り離されたセカンダリ スレッドから、この配列の内容にアクセスしたいと考えています-performSelectorInBackground:withObject:
。二次スレッドの実行中に配列が変更される可能性があり、実際にそうなる可能性があります。
二次スレッドでは、次のようなことをしたい:
if([self.myArray containsObject:foo])
{
//do stuff
}
@synchronized
スレッドのドキュメントを読むと、次のようにアクセサでディレクティブを使用できるはずです。
@implementation MyObject
- (NSArray *)myArray
{
NSArray *result;
@synchronized(self)
{
result = [myArray retain];
}
return [result autorelease];
}
- (void)setMyArray:(NSArray *)aMyArray
{
@synchronized(self)
{
[myArray release];
myArray = [aMyArray copy];
}
}
@end
スレッドセーフを確保するために必要なのはこれだけですか、それとももっと複雑ですか?
更新:その後、Apple のサイトで、この問題について詳しく説明している素晴らしい記事を見つけました: http://developer.apple.com/mac/library/technotes/tn2002/tn2059.html