Pregunta

Todo está funcionando bien hasta que yo llamo el método saveFile (que se muestra a continuación) para escribir el archivo de vuelta al disco, donde se bloquea. ¿Qué estoy haciendo mal?

Esto es parte de mi método viewDidLoad cuando abro el archivo, que trabaja muy bien.

//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"];

A continuación, lo cargo en un tableview. Luego agregar algunos elementos nuevos a la misma, que funciona muy bien. Entonces llamo a este método para salvarlo y se bloquea:

-(void)saveFile {
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   
}
¿Fue útil?

Solución

// ¿y si no se encuentra la ruta, el archivo se carga y no a su vez diccionario es nula

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];

// primera vez que se crea accountsArray, countArray

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease]; }

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease]; }

// oye por qué se asigna accountsArray a un nuevo otra vez, ¿qué pasa con la edad que acaba de init?

// si el diccionario es nula, countarray será nulo también

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

//// //// ////////////////////////////////////////////////// //////////////

¿cuál es su mensaje de choque?

¿cuál es su accountsFilePath

¿Puede usted leer el archivo de diccionario?

una cosa que puede que desee saber

WriteToFile no creará una nueva carpeta para usted

así que todo carpeta en accountsFilePath es una necesidad para estar existir.

de lo contrario es posible que desee crear esa carpeta mediante NSFileManager

Otros consejos

Se le autoreleasing countArray y accountsArray justo después de la inicialización de ellos. Thet bien puede estar ya en libertad cuando intenta salvarlos. Intente comentar la autorelease para los dos (y recuerde que debe liberar en algún lugar, tal vez en el método dealloc).

¿Son todas las variables en el perímetro? Asumo accountsFilePath y un diccionario son variables de clase? Si no podrían morir al final de viewDidLoad.

La otra cosa que podría bocado que es la capacidad de su diccionario es demasiado pequeño, o que el iPhone no le gusta usar el método setObject sobrescribir pares clave / valor por el estilo. Tal vez intente llamar removeObjectForKey:? Y luego añadir de nuevo a medida que tiene por encima

Es probable que ya hizo esto, pero me gustaría inspeccionar diccionario y accountsFilePath en GDB o utilizando NSLog justo antes de la WriteToFile: atómicamente:. Llamar

También puede ser que desee compartir un código más circundante para mostrar qué más está pasando con respecto a este diccionario.

He estado usando NSZombie con mucho éxito para depurar bloqueos aleatorios también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top