我有一个维护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