Pregunta

Estoy utilizando un NSFetchedResultsController para gestionar mostrar objetos gestionados inverosímiles en una vista de tabla que tiene una sección. La tabla comienza vacío y el usuario puede añadir nuevas entidades a que el uso de la interfaz de usuario. En su forma actual, el programa siempre funciona al agregar la primera entidad, y siempre se bloquea cuando la adición de un segundo. A veces se produce ningún error presentado en el accidente y otras veces se producen errores de diferentes tipos (algunos incluyen a continuación). A través de declaraciones de registro y rastreo veo que el programa se bloquea justo después de controllerWillChangeContent delegado del NSFetchResultsController (que llama [self.tableView beginUpdates];) salidas método, pero antes de que cualquier otro método en mi código se llama. Estas son algunas de las partes aplicables en materia de mi código. Configuración del NSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer"
                                    inManagedObjectContext:self.managedObjectContext]];

// Configure request's entity and predicate
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
[fetchRequest setPredicate:predicate];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.managedObjectContext
                                                               sectionNameKeyPath:nil
                                                                        cacheName:nil];
self.resultsController.delegate = self;
[fetchRequest release];

NSError *error = nil;
BOOL success = [resultsController performFetch:&error];
if (!success) {
    NSLog(@"Error fetching request %@", [error localizedDescription]);
}

La adición de nueva entidad:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext];
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
beer.name = beerName;
beer.brewery = self.brewery;

He visto las advertencias en la documentación acerca de los problemas que presentan las tablas con una sección, y he utilizado solución de Apple para que en vano. Esos métodos no están siendo llamados antes del choque de todos modos.

Algunos de los errores que he recibido:

Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null)

Como se puede ver, los errores (cuando uno se presentó) no son consistentes, incluso cuando no se hizo ningún cambio en el código.

¿Alguien puede averiguar lo que estoy haciendo mal?

¿Fue útil?

Solución

Sus errores inconsistentes apuntan a un posible problema de sobre-liberación. Sobre todo porque el cambio de sus delegados a cargar los datos hace que el problema desaparezca. Personalmente me gustaría invertir el tiempo para resolver el problema en lugar de codificar su alrededor a medida que sin duda tiene un problema de código que hay que probablemente se mostrará más adelante en otro lugar.

Me gustaría hacer lo siguiente:

  1. Encienda NSZombie
  2. Añadir un punto de interrupción para objc_exception_throw
  3. Ejecutar en el depurador

Cuando se produce la excepción, mirar en la dirección de memoria y ver lo que se está accediendo y dónde. Esto aislar el problema y le dirá lo que está pasando. También sería útil, si es que no revela el problema, para publicar sus métodos NSFetchedResultsController delegado para que pueda ver si hay algo extraño en ellos.

Lo mejor es actualizar la pregunta original con la información adicional.

Otros consejos

Su código para crear nuevas entidades es todo raro. ¿Qué pasa con el uso de este lugar:

Beer* beer = [NSEntityDescription insertNewObjectForEntityForName: @"Beer" 
    inManagedObjectContext: self.managedObjectContext];
beer.name = @"Grolsch";

Además, no se está llamando NSManagedObjectContext#save:. Pero tal vez usted está haciendo que en una parte de su código que has muestran ahora?

Si bien no se han solucionado este problema en particular, me tomó un enfoque ligeramente diferente a la escritura de la clase que dio la funcionalidad de la que quiero y no causó el problema que se plantea. Sigo usando NSFetchedResultsController, pero en lugar de aplicar los cuatro métodos de delegado, lo único que estoy poniendo en práctica controllerDidChangeContent :, que sólo llama [tableView reloadData].

Esta es la aplicación que se incluye en la clase RootViewController si se crea una nueva aplicación de navegación basada en XCode en que utiliza la base de datos para el almacenamiento. Es probable que pierda algo de control sobre el vector-editar animaciones, pero es más más simple y funciona bien para mis propósitos.

Yo tenía un error similares recientemente - el problema es con más de liberación, en particular:

[sortDescriptors release];

Usted obtiene los sortDescriptors objeto desde

[NSArray arrayWithObjects:sortDescriptor, nil];

que no tiene "alloc", "copia" o "nuevo", por lo que devuelve un objeto autoreleased. Debido a que se libere temprano, se obtienen dos lugares donde se puede Crash - cuando el NSFetchRequest lo usa, y cuando es liberado en la piscina. Ver guía de gestión de la memoria de Apple para obtener más detalles .

Esta es una vieja pero para el beneficio de otros que tienen el mismo problema, he pasado horas tratando de entender lo que estaba pasando y finalmente han encontrado un problema con mi descriptor tipo que estaba causando estos bloqueos aleatorios.

Los mensajes de error variada, pero eran en su mayoría relacionados con un compareObject: selector toObject según abajo

.

- [_ NSCFSet compareObject: toObject:]: Selector no reconocido enviado a la instancia - [ _NSCFString compareObject: toObject:] selector no reconocido enviado a la instancia

Mi sugerencia es tratar de eliminar todos los descriptores de ordenar y predicados de su código y luego agregar uno por uno para encontrar dónde está el problema.

Buena suerte! Rog

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top