【发布时间】:2014-01-15 14:07:26
【问题描述】:
在我的应用程序中,我正在从多个线程访问和更改一个可变数组。一开始,当我尝试使用objectAtIndex 访问对象时,它崩溃了,因为索引超出范围(该索引处的对象已从另一个线程的数组中删除)。我在网上搜索了如何解决这个问题,我决定试试这个solution。我用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]的访问(以及对阵列的所有其他访问)? -
是的,所有使用的方法:count、removeObjectAtIndex、addObject 等。
-
我编辑了问题并添加了整个课程代码
标签: ios objective-c thread-safety nsmutablearray