iPhone - Grand Central Disports Inválido Matriz mutable
-
25-10-2019 - |
Pregunta
Si hago esto
NSMutableArray *allColors;
NSData *dataColor = [dictPLIST objectForKey:@"allColors"];
if (dataColor != nil) {
allColors = [NSMutableArray arrayWithArray:
[NSKeyedUnarchiver unarchiveObjectWithData:dataColor]];
}
dataColor = nil;
Mi matriz mutable AllColors tiene contenidos válidos, pero si creo un grupo GGC y hago esto ...
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);
¿Me estoy perdiendo de algo?
Gracias.
Solución
Está creando una matriz automática y GCD está drenando el grupo de autoresas en algún momento entre cuando el primer bloque se ejecuta y el segundo bloque se ejecuta.
Cada vez que realice una programación concurrente, ya sea por hilo o usando GCD, usted siempre debe retener cualquier objeto que sobreviva más allá de un alcance de ejecución.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow