Iphone 用于访问CGD中共享资源的公共队列
我有一个数组,Iphone 用于访问CGD中共享资源的公共队列,iphone,ios,grand-central-dispatch,Iphone,Ios,Grand Central Dispatch,我有一个数组,sharedArray,其中的对象创建速度很慢。我首先创建它们并将它们同时插入数组中。之后,一些读者同时访问这个sharedArray,获取其中的对象并以自己的方式处理它。我正在经历崩溃,我认为这是由于没有正确访问共享资源造成的。我做错了吗 我使用的是ARC,iOS目标部署版本为5.1。我在设置资源(在代码中标记)时收到错误EXC\u BAD\u ACCESS 多谢各位 //Creation of the array dispatch_queue_t constructionQue
sharedArray
,其中的对象创建速度很慢。我首先创建它们并将它们同时插入数组中。之后,一些读者同时访问这个sharedArray
,获取其中的对象并以自己的方式处理它。我正在经历崩溃,我认为这是由于没有正确访问共享资源造成的。我做错了吗
我使用的是ARC,iOS目标部署版本为5.1。我在设置资源(在代码中标记)时收到错误EXC\u BAD\u ACCESS
多谢各位
//Creation of the array
dispatch_queue_t constructionQueue = dispatch_queue_create("constructionQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(numberOfSlowObjects, constructionQueue, ^(size_t i) {
__block SlowObject *slowOb = [[SlowObject alloc] init];
dispatch_sync(dispatch_get_main_queue(), ^{
[sharedArray setObject:slowOb atIndexedSubscript:i]; //HERE I GET THE ERROR
});
});
dispatch_release(constructionQueue);
//Accessing the array from the different readers
dispatch_queue_t readersQueue = dispatch_queue_create("readersQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(readers.count, readersQueue, ^(size_t i) {
Reader *reader = [readers objectAtIndex:i];
dispatch_queue_t processQueue = dispatch_queue_create("processQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(numberOfSlowObjects, processQueue, ^(size_t j) {
__block SlowObject *slowOb;
dispatch_sync(dispatch_get_main_queue(), ^{
slowOb = [sharedArray objectAtIndex:j];
});
[reader process:slowOb];
});
dispatch_release(processQueue);
});
dispatch_release(readersQueue);
以及sharedArray
(共享资源)惰性初始化的代码:
- (NSMutableArray *) sharedArray
{
if(!_sharedArray){
_sharedArray = [[NSMutableArray alloc] initWithCapacity:numberOfSlowObjects];
for(int i=0;i<numberOfSlowObjects;i++) [_sharedArray addObject:[NSNumber numberWithInt:0]]; //null initialization;
}
return _sharedArray;
}
-(NSMutableArray*)共享Darray
{
如果(!\u sharedArray){
_sharedArray=[[NSMutableArray alloc]initWithCapacity:numberOfSlowObjects];
对于(int i=0;i我的猜测是,在执行它时,您还没有初始化某些内容,您没有执行任何检查,并且并行运行所有内容,这意味着某些代码可能试图访问可能还不存在的值
由于您提供的小图片很难解决这一问题,因此我建议放置一些nslog或debug并逐步执行,以便在执行到达您的阵列时确切地了解发生了什么
我猜当您尝试访问它时,“j”(numberOfSlowObjects)或“sharedArray”不存在。当此崩溃时,您会收到什么消息?在这一行Slowab=[sharedArray objectAtIndex:j]会出现上述错误;?请在代码中标记它,因为您同时运行所有内容。您需要放置一些NSLog以确保所有内容都正常运行。例如,一个NSLog用于numberOfSlowObjects以确保为其分配了一个值,并用于J。然后,您需要在访问sharedArray时查看它是否有任何内容。您使用的是ARC吗?什么版本在您使用的iOS SDK的哪个队列上?在哪个队列上运行此代码?我使用的是ARC,部署目标为5.1。该队列在另一个队列中运行(来自AVFoundation的摄影机队列)。非常感谢您的回答。首先,我不太清楚调试并行执行的最佳方法:您建议将NSLog放在何处?错误并不经常出现。其次,我还更新了代码中出现错误的具体位置。如您所见,是在已存在exi的指定位置设置值时sting数组。太好了,让我们从确保sharedArray设置为NSMutableArray开始吧?这正确吗?还有,您在哪里初始化sharedArray?它是一个NSMutableArray,声明为原子数组。我用惰性初始化方式初始化它。当我调用它时,如果它没有设置,我会用[NSNumber numberWithInt:0]填充它来创建它
。