Question

Tout fonctionne bien jusqu'à ce que j'appelle la méthode de saveFile (ci-dessous) pour écrire le fichier sur le disque, où il se bloque. Qu'est-ce que je fais mal?

Cela fait partie de ma méthode de viewDidLoad où j'ouvre le fichier, qui fonctionne très 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"];

Ensuite, je charge dans un tableview. Je puis ajouter quelques nouveaux éléments à ce qui fonctionne très bien. Ensuite, j'appelle cette méthode pour enregistrer et il se bloque:

-(void)saveFile {
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   
}
Était-ce utile?

La solution

// si le chemin est introuvable, le fichier est pas chargé et dans le dictionnaire tour est nul

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

// première fois que vous créez accountsArray, countArray

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

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

// hey pourquoi vous attribuez accountsArray à une nouvelle fois, qu'en l'ancien que vous venez de init?

// si le dictionnaire est nul, countarray sera nul aussi

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

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

Quel est votre message de plantage?

quel est votre accountsFilePath

vous pouvez lire le fichier dictionnaire?

une chose que vous voudrez peut-être savoir

writeToFile ne va pas créer un nouveau dossier pour vous

donc tout dossier dans accountsFilePath est un must pour être exister.

sinon vous pouvez créer ce dossier en utilisant NSFileManager

Autres conseils

Vous autoreleasing countArray et accountsArray juste après leur initialisation. Thet pourrait bien être déjà libéré lorsque vous essayez de les sauver. Essayez de commenter la autorelease pour les deux (et souvenez-vous de les libérer quelque part, peut-être dans la méthode dealloc).

sont toutes vos variables dans la portée? Je suppose accountsFilePath et le dictionnaire sont des variables de classe? Dans le cas contraire, ils pourraient mourir à la fin de viewDidLoad.

L'autre chose qui pourrait mordre vous est la capacité de votre dictionnaire est trop petit, ou que l'iPhone ne vous aime pas utiliser la méthode setObject pour remplacer les paires clé / valeur comme ça. Peut-être essayer d'appeler removeObjectForKey: puis l'ajouter à nouveau que vous avez ci-dessus

Vous avez probablement déjà fait cela, mais j'inspectaient le dictionnaire et accountsFilePath à gdb ou en utilisant droite NSLog avant la writeToFile: atomiquement. Appeler

Vous pouvez également partager le code plus environnant pour montrer ce qu'il se passe par rapport à ce dictionnaire.

Je me sers NSZombie avec beaucoup de succès pour le débogage des plantages aléatoires ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top