У меня есть приложение (использующее retain / release, а не GC), которое поддерживает переменную экземпляра NSArray
, которая отображается в виде свойства, например:
@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