iOS*_*Dev 3 objective-c thread-safety nsmutablearray ios
在我的应用程序中,我正在访问并从多个线程更改可变数组.一开始它在我尝试访问一个对象时崩溃objectAtIndex,因为索引超出了界限(该索引处的对象已经从另一个线程中的数组中删除).我在互联网上搜索了如何解决这个问题,我决定尝试这个解决方案.我创建了一个带有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];
}
}
Run Code Online (Sandbox Code Playgroud)
我使用这个类而不是旧的可变数组,但应用程序仍然在这一行崩溃:return [_array objectAtIndex:index];我尝试了这种方法NSLock,但没有运气.我做错了什么以及如何解决这个问题?
我相信这个解决方案很差.考虑一下:
count并被告知阵列中有4个对象.removeObjectAtIndex:2数组.objectAtIndex:3并发生错误.相反,您需要一个更高级别的锁定机制,其中锁定在步骤1和5的数组周围,而线程#2无法在这些步骤之间移除对象.
| 归档时间: |
|
| 查看次数: |
3302 次 |
| 最近记录: |