Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 用于访问CGD中共享资源的公共队列_Iphone_Ios_Grand Central Dispatch - Fatal编程技术网

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]填充它来创建它