用于访问CGD中共享资源的公共队列

时间:2013-05-28 20:30:32

标签: iphone ios grand-central-dispatch

我有一个数组sharedArray,这些数组的创建速度很慢。我首先创建它们并同时将它们插入到数组中。之后,一些读者同时访问此sharedArray,获取其中的对象并以自己的方式处理它。我遇到崩溃,我想这是因为没有正确访问共享资源。我做错了吗?

我正在使用ARC,iOS目标部署版本为5.1。设置资源(在代码中标记)时,我收到错误EXC_BAD_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;
}

1 个答案:

答案 0 :(得分:0)

我的猜测是,在执行它时没有初始化的东西,你没有检查并同时运行所有内容,这意味着某些代码可能试图访问可能尚不存在的值。

由于使用您提供的小图片很难解决问题,我建议您安装一些NSLog或调试并逐步查看执行到达阵列时到底发生了什么。

当您尝试访问它时,我的猜测“j”(numberOfSlowObjects)或“sharedArray”不存在。