ios – NSMutableArray线程安全

ios – NSMutableArray线程安全,第1张

概述在我的应用程序中,我正在访问并从多个线程更改可变数组.当我尝试使用objectAtIndex访问一个对象时,它开始崩溃,因为索引超出了边界(该索引处的对象已经从另一个线程中的数组中删除).我在互联网上搜索了如何解决这个问题,我决定尝试这个 solution.我用NSMutableArray属性创建了一个类,请看下面的代码: @interface SynchronizedArray()@prope 在我的应用程序中,我正在访问并从多个线程更改可变数组.当我尝试使用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,但没有运气.我做错了什么以及如何解决这个问题?

解决方法 我相信这个解决方案很差.考虑一下:

>线程#1调用count,并告知阵列中有4个对象.
>数组未同步.
>线程#2在数组上调用removeObjectAtIndex:2.
>数组未同步.
> thread#1调用objectAtIndex:3并发生错误.

相反,您需要一个更高级别的锁定机制,其中锁定在步骤1和5的数组周围,而线程#2无法在这些步骤之间移除对象.

总结

以上是内存溢出为你收集整理的ios – NSMutableArray线程安全全部内容,希望文章能够帮你解决ios – NSMutableArray线程安全所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1008480.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存