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!