iPhone - Grand Central Dispatch недопустимый изменяемый массив - PullRequest
1 голос
/ 24 июля 2011

если я сделаю это

NSMutableArray *allColors;
NSData *dataColor = [dictPLIST objectForKey:@"allColors"];
if (dataColor != nil)   {
    allColors = [NSMutableArray arrayWithArray:
      [NSKeyedUnarchiver unarchiveObjectWithData:dataColor]];
}
dataColor = nil;

Мой изменяемый массив allColors содержит допустимое содержимое, но если я создам группу GGC и сделаю это ...

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

__block NSMutableArray *allColors;
dispatch_group_async(group, queue, ^{
    NSData *dataColor = [dictPLIST objectForKey:@"allColors"];
    if (dataColor != nil)   {
        allColors = [NSMutableArray arrayWithArray:
              [NSKeyedUnarchiver unarchiveObjectWithData:dataColor]];
    }
    dataColor = nil;    
});

// .... other stuff is added to the group


dispatch_group_notify(group, queue, ^{
   dispatch_group_async(group, queue, ^{

    // if I try to access allColors here, the app crashes

   });

});

dispatch_release(group);

я что-то упустил?

спасибо.

1 Ответ

2 голосов
/ 24 июля 2011

Вы создаете автоматически высвобождаемый массив, и пул авто-выпуска очищается GCD в промежутке между выполнением первого блока и выполнением второго блока.

Каждый раз, когда вы выполняете параллельное программирование, будь то поток или использованиеGCD, вы всегда должны жестко удерживать любой объект, который должен выжить за пределами одной области исполнения .

...