在我的应用程序中,我正在访问和更改多线程的可变数组。在开始时,当我试图访问objectAtIndex
的对象时,因为索引超出了界限(该索引处的对象已经从另一个线程中的数组中移除),因此崩溃了。我在网上搜索如何解决这个问题上,我决定尝试这个solution。我做了一个类NSMutableArray
属性,看下面的代码:NSMutableArray线程安全
@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];
}
}
,我使用这个类来代替旧的可变数组,但该应用程序仍在这条线上崩溃:return [_array objectAtIndex:index];
我也试过这种方法NSLock
,但没有运气。我做错了什么以及如何解决这个问题?
您是否正在同步对[[NSMutableArray count]]的访问(以及对数组的每次访问)? – trojanfoe
是的,所有使用的方法:计数,removeObjectAtIndex,addObject等 –
我编辑的问题,并添加了整个班级代码 –