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];   
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top