Problema escrita a um plist
-
13-09-2019 - |
Pergunta
Tudo está funcionando bem até que eu chamar o método saveFile
(mostrado abaixo) para escrever a parte de trás do arquivo no disco, onde ele trava. O que estou fazendo de errado?
Isso faz parte do meu método viewDidLoad
onde eu abrir o arquivo, que funciona bem.
//Get The Path
[self initPath];
dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];
if (accountsArray == nil) {
accountsArray = [[[NSMutableArray alloc]init] autorelease];
}
if (countArray == nil) {
countArray = [[[NSMutableArray alloc]init] autorelease];
}
countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];
Então eu carregá-lo em um tableview. Eu, então, adicionar alguns novos itens a ela, que funciona bem. Então eu chamar esse método para salvá-lo e ele trava:
-(void)saveFile {
[dictionary setObject:accountsArray forKey:@"username"];
[dictionary setObject:countArray forKey:@"count"];
[dictionary writeToFile:accountsFilePath atomically:YES];
}
Solução
// e se o caminho não foi encontrado, arquivo não é carregar e, por sua vez dicionário é nulo
dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];
// primeira vez que criar accountsArray, countArray
if (accountsArray == nil) {
accountsArray = [[[NSMutableArray alloc]init] autorelease]; }
if (countArray == nil) {
countArray = [[[NSMutableArray alloc]init] autorelease]; }
// hey por que você atribui accountsArray para um novo de novo, o que acontece com o antigo você apenas o init?
// se dicionário é nulo, countarray será nula demasiado
countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];
//// //// ////////////////////////////////////////////////// //////////////
qual é a sua mensagem de acidente?
qual é o seu accountsFilePath
você pode ler o arquivo de dicionário?
uma coisa que você pode querer saber
WriteToFile não vai criar uma nova pasta para você
então tudo que pasta na accountsFilePath é uma obrigação para ser existir.
caso contrário, você pode querer criar essa pasta usando NSFileManager
Outras dicas
Você está autoreleasing countArray
e accountsArray
logo após a inicialização-los. Thet pode muito bem já estar liberada quando você tentar salvá-los. Tente comentar o autorelease
para ambos (e lembre-se de liberá-los em algum lugar, talvez no método dealloc
).
Tem todas as suas variáveis ??no escopo? Presumo accountsFilePath e dicionário são variáveis ??de classe? Se não eles podem morrer no final do viewDidLoad.
A outra coisa que pode mordê-lo é a capacidade de seu dicionário é muito pequeno, ou que o iPhone não gosta de você usando o método setObject a pares de chave / valor sobrescrever assim. Talvez tente chamar removeObjectForKey:? E, em seguida, adicioná-lo de volta como você tem acima
Você provavelmente já fez isso, mas eu gostaria de inspecionar dicionário e accountsFilePath no gdb ou usando NSLog direita antes da WriteToFile: atomicamente:. Chamada
Você também pode querer compartilhar mais em torno do código para mostrar o que mais está acontecendo com relação a este dicionário.
Eu tenho usado NSZombie com muito sucesso para depurar falhas aleatórias também.