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:
database = [[NSMutableArray alloc] init];
e meu objeto personalizado, chamado "recordObject", contém as seguintes variáveis e inits:
NSString *name;
int anInt;
Bool aBool;
Eu também sintetizei métodos para poder fazer chamadas como:
aString = [[database objectAtIndex:someIndex] name];
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:
-(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"];
}
Para gravar o arquivo, usei o seguinte:
[NSKeyedArchiver archiveRootObject:database toFile:myPath];
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:
database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
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:
x = [database count];
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:
aString = [[database objectAtIndex:someIndex] name];
o programa trava e retorna o seguinte erro no console:
Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
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!