NSKeyedArchiver y NSKeyedUnarchiver con NSMutableArray

Espero que esto no tenga nada que ver con el hecho de que estoy usando una matriz Mutable aquí, pero esta me desconcierta, por lo que no me sorprendería si ese fuera el caso.

FONDO:

He hecho una pequeña base de datos que es esencialmente un NSMutableArray que contiene objetos personalizados, que podemos llamar recordObjects. Configuré la matriz:

<code>database = [[NSMutableArray alloc] init];
</code>

y mi objeto personalizado, llamado "recordObject" contiene las siguientes variables y se incluye en su:

<code>NSString *name;
int       anInt;
Bool      aBool;
</code>

También sinteticé métodos para poder hacer llamadas como:

<code>aString = [[database objectAtIndex:someIndex] name];
</code>

Y se agregaron métodos a mi clase de controlador para agregar, eliminar y seleccionar los registros individuales para mostrar. Hasta ahora todo funciona correctamente y exactamente como se esperaba.

A continuación, configuré mi clase recordObject (subclase de NSObject) para usar el NSCoder (incluyéndolo en la directiva @interface) y agregué los siguientes métodos personalizados de codificador y decodificador en el archivo de implementación:

<code>-(void) encodeWithCoder: (NSCoder *) encoder {
    [encoder encodeObject: name  forKey: @"recordName"];
    [encoder encodeInt:    anInt forKey: @"recordInteger"];
    [encoder encodeBool:   aBool forKey: @"recordBool"];
}

-(id) initWithCoder: (NSCoder *) decoder {
    name    = [decoder decodeObjectForKey: @"recordName"];
    anInt   = [decoder decodeIntForKey:    @"recordInteger"];
    aBool   = [decoder decodeBoolForKey:   @"recordBool"];
}
</code>

Para escribir el archivo, he usado lo siguiente:

<code>[NSKeyedArchiver archiveRootObject:database toFile:myPath];
</code>

Cuando ejecuto el programa, todo parece funcionar correctamente. Se llama al método del codificador para cada uno de los registros de la matriz y el archivo se escribe en el disco. Al abrir el archivo con TextEdit, se muestra que los datos están allí (aunque en mi mayoría son ininteligibles para mí).

EL PROBLEMA:

Aquí es donde me encuentro con un obstáculo.

Agregué el siguiente código para CARGAR el archivo en mi matriz de base de datos:

<code>database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
</code>

Cuando vuelvo a ejecutar el programa, esta vez cargando la base de datos, parece que funciona correctamente. Mi primera prueba fue usar el método de conteo NSMutableArray:

<code>x = [database count];
</code>

El resultado fue que X se llena con el número correcto de registros en el archivo. Si había 5 registros cuando guardé la base de datos, X se establece en 5 después de cargar la base de datos en la siguiente ejecución del programa.

Ahora, aquí está el gran problema:

El programa se bloquea si intento usar CUALQUIERA de mis métodos de acceso. Por ejemplo, si intento usar lo siguiente después de cargar la base de datos:

<code>aString = [[database objectAtIndex:someIndex] name];
</code>

El programa se bloquea y devuelve el siguiente error en la consola:

<code>Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
</code>

Mi interpretación es que los datos no se están cargando e inicializando en la matriz de la base de datos correctamente por alguna razón, pero por mi vida no puedo averiguar dónde me he equivocado aquí.

Como nota al margen, todo lo que he implementado proviene del libro "Programming in Objective-C" de Stephen G. Kochan

¡Cualquier idea sería apreciada grandemente!

Respuestas a la pregunta(4)

Su respuesta a la pregunta