varios ser pueden puede objetos más mensaje mas guardar guardados guardado formato este especificado error dibujo con civil archivo ios nsmutabledictionary nscoding

ser - mensaje de autocad uno o varios



NSCoding de NSMutableDictionaries que contiene objetos personalizados (3)

Intentaba serializar un objeto SearchEntity (objeto personalizado) que contenía un NSMutableDictionary contenía un conjunto de tipo CategoryEntity (objeto personalizado).

1 SearchEntity<NSCoding> contiene: 1 parámetros de NSMutableDictionary (parámetros) que contienen X CategoryEntities<NSCoding> contienen solo cadenas y números.

En esta línea [encoder encodeObject:parameters forKey:kPreviousSearchEntityKey]; en SearchEntity encodeWithCoder "Recibo GDB: Interrumpido cada vez, no hay mensaje de error, excepción, etc. solo GDB: Interrumpido.

Esta es la implementación en SearchEntity y los parámetros son el NSMutableDictionary

#pragma mark - #pragma mark NSCoding delegate methods - (void) encodeWithCoder:(NSCoder*)encoder { //encode all the values so they can be persisted in NSUserdefaults if (parameters) [encoder encodeObject:parameters forKey:kPreviousSearchEntityKey]; //GDB:Interrupted! } - (id) initWithCoder:(NSCoder*)decoder { if (self = [super init]) { //decode all values to return an object from NSUserdefaults in the same state as when saved [self setParameters:[decoder decodeObjectForKey:kPreviousSearchEntityKey]]; } return self; }

CategoryEntity también implementa el protocolo NSCoding y se ve así:

- (void) encodeWithCoder:(NSCoder*)encoder { //encode all the values so they can be persisted in NSUserdefaults [encoder encodeObject:ID forKey:kIDKey]; [encoder encodeObject:text forKey:kTextKey]; [encoder encodeObject:category forKey:kCategoryKey]; [encoder encodeObject:categoryIdentifierKey forKey:kCategoryIdentifierKey]; } - (id) initWithCoder:(NSCoder*)decoder { if (self = [super init]) { //decode all values to return an object from NSUserdefaults in the same state as when saved [self setID:[decoder decodeObjectForKey:kIDKey]]; [self setText:[decoder decodeObjectForKey:kTextKey]]; [self setCategory:[decoder decodeObjectForKey:kCategoryKey]]; [self setCategoryIdentifierKey:[decoder decodeObjectForKey:kCategoryIdentifierKey]]; } return self; }

Intento codificarlo desde una envoltura para NSUserDefaults, como esto:

+ (void) setPreviousSearchParameters:(SearchParameterEntity*) entity { if (entity) { //first encode the entity (implements the NSCoding protocol) then save it NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:entity]; [[self defaults] setObject:encodedObject forKey:kPreviousSearchKey]; [[self defaults] synchronize]; } } + (SearchParameterEntity*) getPreviousSearchParameters { //retrieve the encoded NSData object that was saved, decode and return it SearchParameterEntity *entity = nil; NSData *encodedObject = [[self defaults] objectForKey:kPreviousSearchKey]; if (encodedObject) entity = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject]; return entity; }

Estaba pensando que cuando pido Serializar el SearchEntity, comenzaría a serializar el objeto de parámetros mutableDictionary, NSCoder llamará "codificar" en las CategoryEntities contenidas en el diccionario y todos responderán con sus objetos codificados correctos.

Sin embargo, acabo de obtener GDB: Interrumpido en la parte inferior de la consola.

¿Cómo puedo depurar esto?

¿Y mi enfoque es incorrecto? ¿Debería envolver todos los niveles de codificación en NSData?

PD. Hago exactamente lo mismo con un ResultEntity contiene NSArrays de CategoryEntities , se codifica sin problemas, así que supongo que el NSMutableDictionary es lo único que sobresale.


El código que has publicado no parece ser incorrecto. Hice una mejor estimación de algunos detalles que ha omitido y obtengo un resultado exitoso de un programa de prueba que contiene su código con suficiente información para mostrar que se codifica / decodifica correctamente.

(Puede compilarlo desde la línea de comandos usando: gcc -framework foundation test.m -o test y ejecutar con: ./test .)

Con respecto a su pregunta, ¿cómo puedo depurar esto , sugeriría un enfoque como el siguiente:

  • (Temporalmente) modifique su código para que sea lo más simple posible . Por ejemplo, podría cambiar la propiedad de parameters a una NSString simple y verificar que funcione correctamente primero.
  • Agregue lentamente la complejidad, introduciendo una nueva propiedad a la vez , hasta que el error comience a ocurrir nuevamente. Eventualmente, reducirá de dónde provienen los datos problemáticos.

Desafortunadamente, si esto ocurre debido a una memoria mal administrada en otra parte de su aplicación, la depuración de este código en sí puede no llevarlo a ninguna parte. Intente (manualmente) verificar que la memoria se administre correctamente para cada parte de los datos que está recibiendo para la codificación.

Si ya está utilizando Core Data , podría considerar persistir solo la ID del objeto en los valores predeterminados del usuario y restaurar su gráfico de objetos basándose en eso. (Consulte: Archivar NSManagedObject con NSCoding ).


El problema con el archivo de objetos con NSKeyedArchiver es que no puede codificar objetos mutables . Solo se pueden serializar las instancias de NSArray , NSDictionary , NSString , NSDate , NSNumber y NSData (y algunas de sus subclases)

Entonces, en su método encodeWithCoder: debe intentar crear NSDictionary desde NSMutableDictionary y luego codificar el inmutable:

if (parameters) { NSDictionary *dict = [NSDictionary dictionaryWithDictionary:parameters]; [encoder encodeObject:dict forKey:kPreviousSearchEntityKey]; }

También en el método initWithCoder: intente crear NSMutableDictionary desde el codificado inmutable:

NSDictionary *dict = [decoder decodeObjectForKey:kPreviousSearchEntityKey]; [self setParameters:[NSMutableDictionary dictionaryWithDictionary:dict]];

También verifique que todos los objetos dentro del diccionario de parameters cumplan con el protocolo de codificación NSC y asegúrese de que todos ellos codifiquen solo los objetos inmutables en sus métodos encodeWithCoder: .

Espero que resuelva el problema.


Le sugiero que evite el NSMutableArray primero. Deje que SearchEntity contenga solo una CategoryEntity y vea si funciona.

El código que publicaste se ve bien, es posible que desees darnos un contexto más detallado.

Para la codificación de objetos, este archivo puede ayudar: DateDetailEntry