10

He encontrado algunos problemas al guardar NSManagedObjectContext dentro de NSOperation con ARC activado. Sin ARC, todo estaba bien antes. Siempre da EXC_BAD_ACCESS durante el guardado. El código es el siguiente:EXC_BAD_ACCESS en el método de guardado NSManagedObjectContext dentro de NSOperation y ARC, ¿por qué?

//on the main thread 
-(void)someFunc 
{ 
    array = ... //fetching an array of entities from a core data 
    for(SomeEntity * obj in array) 
    { 
     NSSomeOperation * op = [[NSSomeOperation alloc] initWithValue:[obj someField]]; 
     //start an operation 
    } 
} 

//NSSomeOperation implementation 
//... 
- (void)main { 
    //some code 
    NSError * error = nil; 
    [mainContext lock]; 
    if (![mainContext save:&error]) { //<--- HERE EXC_BAD_ACCESS 
     //process error 
    }  
    [mainContext unlock]; 
    //some code 
} 
//... 

El uso de [setRetainsRegisteredObjects mainContext: SI] y objectWithID no resuelven este problema.

EXC_BAD_ACCESS (código = 1)
EXC_BAD_ACCESS (código = 13)

-[__NSCFType contextDidSave:]: unrecognized selector sent to instance 0x7fc5c505d940 

An observer of NSManagedObjectContextDidSaveNotification illegally threw an exception. 

Objects saved = { 
    inserted = "{(\n)}"; 
    updated = "{(\n <SomeEntity: 0x7fc5c55b6220> (entity: SomeEntity; id: 0x7fc5c5052b20 ...)}"; } 
and exception = -[__NSCFType contextDidSave:]: unrecognized selector sent to instance 0x7fc5c505d940 with userInfo = (null) 

uso un contexto de objeto gestionado separado y buscar mi objetos gestionados dentro de este NSOperation.

¿Tal vez se trata de algo relacionado con errores de datos centrales o ARC? Quizás ARC limpie algunos de los objetos que deben guardarse. Porque, sin ARC todo estaba bien, todo funcionó. Cuando encendí ARC - EXC_BAD_ACCESS.

¿Alguien sabe por qué ocurre?

+2

¿Esto está en el hilo principal? – Jim

+2

No, Jim. Esto está dentro de NSOperation, en el otro hilo. –

+3

De acuerdo, la razón por la que pregunto es porque puede agregar una NSOperation a la cola principal (usando NSOperationQueue mainQueue] addOperation: ...]. Si esto está en un hilo secundario o cola, ¿está siguiendo la documentación de Apple para usar un archivo separado? contexto de objeto gestionado, y fusionar los cambios de nuevo en el contexto en la cola principal? – Jim

Respuesta

26

Quizás ARC desasigna algún objeto que recibe NSManagedObjectContextDidSaveNotification y esto causa la excepción? Tuve algo similar, y lo solucioné asegurándome de removeObserver: antes de que el objeto se desasignara.

Tenga en cuenta que la excepción CoreData en realidad oculta la excepción del centro de notificación, por lo que no puede verla.

+1

Gracias, Yonat! Sí, tienes toda la razón. Acabo de intentar eliminarObserver: - y no ayuda. –

+4

haga clic en la marca de verificación si esto fue absolutamente correcto. :-) – griotspeak

+0

Llamé 'removeObserver:' en 'dealloc' de mi singleton con contexto compartido. Eliminando el problema resuelto 'dealloc', pero ¿dónde debería' removeObserver'? –

Cuestiones relacionadas