0

sharedArray作成が遅いオブジェクトの配列 があります。最初にそれらを作成し、同時に配列に挿入します。その後、一部のリーダーが並行して thissharedArrayにアクセスし、その中のオブジェクトを取得して独自の方法で処理します。共有リソースに正しくアクセスしていないと思われるクラッシュが発生しています。私はそれを間違っていますか?

iOS ターゲット展開バージョン 5.1 で ARC を使用しています。リソースを設定するときにエラーが発生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;
}
4

1 に答える 1

0

私の推測では、実行するまでに何かが初期化されておらず、チェックが行われておらず、すべてを同時に実行しているため、コードがまだ存在しない可能性のある値にアクセスしようとしている可能性があります。

これは、提供されている小さな画像ではトラブルシューティングが難しいため、実行が配列に到達したときに何が起こっているかを正確に確認するために、いくつかの NSLog またはデバッグを配置することをお勧めします。

アクセスしようとすると、「j」(numberOfSlowObjects)または「sharedArray」は存在しないと思います。

于 2013-05-29T15:01:34.287 に答える