Bezpieczeństwo nitek NSMutableArray
W mojej aplikacji uzyskuję dostęp i zmieniam zmienną tablicę z wielu wątków. Na początku zawieszał się, gdy próbowałem uzyskać dostęp do obiektu za pomocąobjectAtIndex
, ponieważ indeks był poza zakresem (obiekt w tym indeksie został już usunięty z tablicy w innym wątku). Szukałem w Internecie, jak rozwiązać ten problem, i postanowiłem spróbowaćrozwiązanie Zrobiłem klasęNSMutableArray
właściwość, patrz następujący kod:
@interface SynchronizedArray()
@property (retain, atomic) NSMutableArray *array;
@end
@implementation SynchronizedArray
- (id)init
{
self = [super init];
if (self)
{
_array = [[NSMutableArray alloc] init];
}
return self;
}
-(id)objectAtIndex:(NSUInteger)index
{
@synchronized(_array)
{
return [_array objectAtIndex:index];
}
}
-(void)removeObject:(id)object
{
@synchronized(_array)
{
[_array removeObject:object];
}
}
-(void)removeObjectAtIndex:(NSUInteger)index
{
@synchronized(_array)
{
[_array removeObjectAtIndex:index];
}
}
-(void)addObject:(id)object
{
@synchronized(_array)
{
[_array addObject:object];
}
}
- (NSUInteger)count
{
@synchronized(_array)
{
return [_array count];
}
}
-(void)removeAllObjects
{
@synchronized(_array)
{
[_array removeAllObjects];
}
}
-(id)copy
{
@synchronized(_array)
{
return [_array copy];
}
}
i używam tej klasy zamiast starej tablicy mutable, ale aplikacja nadal zawiesza się w tej linii:return [_array objectAtIndex:index];
Próbowałem również tego podejściaNSLock
, ale bez szczęścia. Co robię źle i jak to naprawić?