NSKeyedArchiver e NSKeyedUnarchiver com NSMutableArray

Eu estou esperando que isso não tenha a ver com o fato de que estou usando um array Mutable aqui, mas este está me desconcertando, então não me surpreenderia se fosse esse o caso.

FUNDO:

Eu fiz um pequeno banco de dados que é essencialmente um NSMutableArray contendo objetos personalizados, que podemos chamar de recordObjects. Eu configurei o array:

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

e meu objeto personalizado, chamado "recordObject", contém as seguintes variáveis ​​e inits:

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

Eu também sintetizei métodos para poder fazer chamadas como:

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

E adicionei métodos à minha classe controladora para adicionar, remover e selecionar os registros individuais para exibição. Até agora, tudo funciona corretamente e exatamente como esperado.

Em seguida, configurei minha classe recordObject (subclasse de NSObject) para usar o NSCoder (incluindo a diretiva @interface e incluímos os seguintes métodos personalizados de codificador e decodificador no arquivo de implementação:

<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 gravar o arquivo, usei o seguinte:

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

Quando executo o programa, tudo parece funcionar corretamente. O método do codificador é chamado para cada um dos registros na matriz e o arquivo é gravado no disco. Abrir o arquivo com o TextEdit mostra que os dados estão lá (embora sejam ininteligíveis para mim).

O PROBLEMA:

Aqui é onde eu me deparo com um obstáculo.

Eu adicionei o seguinte código para carregar o arquivo em minha matriz de banco de dados:

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

Quando executo o programa novamente, desta vez Carregando o banco de dados, APARECE trabalhar corretamente. Meu primeiro teste foi usar o método de contagem NSMutableArray:

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

O resultado foi que X é preenchido com o número correto de registros no arquivo. Se houver 5 registros quando eu salvei o banco de dados, X é definido como 5 depois de carregar o banco de dados na próxima execução do programa.

Agora, aqui está o grande problema:

O programa trava se eu tentar usar qualquer um dos meus métodos de acesso. Por exemplo, se eu tentar usar o seguinte depois de carregar o banco de dados:

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

o programa trava e retorna o seguinte erro no console:

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

Minha interpretação é que os dados não estão sendo carregados e inicializados na matriz do banco de dados corretamente por algum motivo, mas para a vida de mim eu não consigo descobrir onde estou errado aqui.

Como uma nota lateral, tudo que eu implementei veio do livro de Stephen G. Kochan "Programming in Objective-C"

Qualquer idéia seria muito apreciada!

questionAnswers(4)

yourAnswerToTheQuestion