Problème d'écriture à un plist
-
13-09-2019 - |
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];
}
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.