Objective-C copia de un NSArray correctamente?

Mi aplicación para el iPhone se bloquea continuamente, y he estrechado hacia abajo a este una línea sobre el pasado sangriento de la semana:

NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];

Estoy de obtener el resultado correcto de la anterior, pero la aplicación se bloquea después de acceder a él (EXC_BAD_ACCESS).
¿Cómo puedo copiar el contenido de fetchResults para que yo pueda jugar con ella?

He intentado

NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];

pero la única cosa que no se bloquee la aplicación es

NSArray *retVal = [[NSArray alloc] initWithArray:nil];

Podría alguien ayudarme? Estoy pensando en que voy a necesitar una lección en Obj-C gestión de la memoria.

EDICIÓN:
He aquí un ejemplo más completo de código que los accidentes de tráfico:

NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
[request release];
NSMutableArray *retVal = [NSMutableArray arrayWithCapacity:0];
for(Job *job in fetchResults){
    //NSLog(@"dev: %@",job.lastmod_device);
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                            [job.jobkey copy], @"entitykey",
                            [NSNumber numberWithInt:[job.lastmod_device timeIntervalSince1970]], @"job_lastmod_device",
                            [NSNumber numberWithInt:[job.lastmod_server timeIntervalSince1970]], @"job_lastmod_server",
                            [NSNumber numberWithInt:[job.customer.lastmod_device timeIntervalSince1970]], @"customer_lastmod_device",
                            [NSNumber numberWithInt:[job.customer.lastmod_server timeIntervalSince1970]], @"customer_lastmod_server",
                            [NSNumber numberWithInt:[job.productionschedule_lastmod_device timeIntervalSince1970]], @"productionschedule_lastmod_device",
                            [NSNumber numberWithInt:[job.productionschedule_lastmod_server timeIntervalSince1970]], @"productionschedule_lastmod_server", nil];
    //NSLog(@"dict: %@", dict);
    [retVal addObject:dict];
}
return retVal;

Y el código que llama a este método:

NSArray *arr2 = [self retrieveJobs];

(que es; yo nunca incluso el uso de la variable)

EDIT 2:
Incluso sólo iterando sobre la tomó de resultado con un vacío en bucle y no hacer nada más con el fetchResults objeto hace que el bloqueo de la aplicación. ¿Cómo es siquiera posible?

Por favor, mostrar, donde puedes acceder a los resultados.
Ver la edición anterior

OriginalEl autor kbanman | 2010-02-25

5 respuestas

  1. 19

    Que se paliza; de estas líneas de código…

    NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
    NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
    NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];

    Los dos últimos son simples fugas. La primera es una manera de hacer una copia, pero retVal = [fetchResults copy]; es una mejor manera de hacer una copia.

    Pero, por supuesto, usted no necesita una copia en todas. Ese no es el problema. Te van a decir que la única cosa que no se desplome es un conjunto de resultados vacío.

    Que indica una de dos cosas; o bien el conjunto de resultados es corrupto (poco probable) o que tiene acceso el conjunto de resultados de forma incorrecta (probable).

    La “paliza” es que usted tiene una pregunta acerca de un accidente sin incluir la traza de la caída o de la ubicación del accidente. Agregar esos y lo más probable es obtener una respuesta en el corto plazo.

    (Y no ofenda a la “paliza” — todos lo hacemos. Incluso después de 20 años de Objective-C, todavía tengo que facepalm, un paso atrás, y pensar las cosas a través de alejarse de la trilla.)

    OriginalEl autor bbum

  2. 2

    NSArray *retVal = [fetchResults retain] debe mantener todo alrededor de usted. No es una copia, pero espero que eso no es realmente lo que estás tratando de hacer. Su primer intento debe hacer una copia. Todos son propensos a las fugas, si no tienes cuidado a pesar de que (el segundo ejemplo fugas garantizado). Está usted seguro de que no estás haciendo algo más en el programa que hace que esta parte del código no?

    Aquí son algunas de las opciones para hacer una copia real si eso es lo que quieres:

    NSArray *retVal = [fetchResults copy];
    NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];

    Tanto de aquellos volver retenido matrices.

    OriginalEl autor Carl Norum

  3. 1

    Son usted seguro de que el fetch solicitud de devolución de los datos? De acuerdo a la documentación:

    Una matriz de objetos que cumplen los criterios especificados por la petición recuperado del receptor y de la persistente tiendas asociadas con el receptor del almacén persistente de coordinador. Si se produce un error, devuelve nil. Si no hay objetos que coinciden con los criterios especificados por la petición, devuelve una matriz vacía.

    También, podrías mostrar el código donde puede tener acceso a la matriz? Es en el mismo método con el que se está ejecutando la recuperación solicitud?

    OriginalEl autor kubi

  4. 1
    NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
    NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
    NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];

    ¿Estás seguro de que fetchResults contiene el resultado? Porque puede haber una posibilidad de que “fetchResults” objeto en sí mismo liberado y que apunta a algunos de basura ubicación. Es por eso que usted está recibiendo accidente. Revisar e informar si fetchResults es un objeto válido o no.

    OriginalEl autor Manjunath

  5. 0

    Para obtener una copia auténtica sin una referencia a la original, usted tendrá que hacer una copia en PROFUNDIDAD. Es un método para archivar la matriz y descomprimir de nuevo en un NSArray.

    Colecciones con IOS

    OriginalEl autor Tim Glenn

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *