У меня есть приложение (использующее сохранение/выпуск, а не 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