Question

Je suis en train d'enregistrer deux chaînes. Une chaîne doit être enregistré en tant que type ARRAY dans la pList et la deuxième chaîne doit être enregistré sous forme de chaîne dans le tableau.

Je peux utiliser le code:

[dictionnaire setObject: (id) anObject forKey: (id) aKey>]

mais il ne sauve pas correctement. Je peux jeter l'une des chaînes comme un tableau, mais il ne fonctionne toujours pas droit.

Quelle est la méthode appropriée pour l'enregistrement d'un tableau à l'pList?

Voici ce que mon pList ressemble à:

<dict>
<key>Test One</key>
<array>
    <string>A13#</string>
</array>
<key>Another Test</key>
<array>
    <string>1111111111</string>
</array>
<key>Test Three</key>
<array>
    <string>2222222222</string>
</array>
<key>Final Test</key>
<array>
    <string>3333333333</string>
</array>
</dict>

Voici la méthode que je me sers pour essayer de

-(void)writeToFile:(NSString *)s1{
    NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];

NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];

[dictionary writeToFile:plistPath atomically:YES];
}
Était-ce utile?

La solution

Vous ne pouvez pas lancer ou autrement convertir une chaîne en un tableau; ils sont séparés, des objets distincts. Il est le même que si dans la vraie vie, vous essayez de transformer votre chien dans une voiture familiale, il ne se produit pas.

Au lieu de cela, mettre votre chien à l'intérieur du break (ou mettre votre chaîne (s) dans un tableau). Vous pouvez créer le tableau avec [NSArray arrayWithObjects:@"string1", @"string2", nil];. Tenez-vous que dans votre dictionnaire pour une clé donnée, ainsi que votre chaîne finale pour une autre clé, enregistrez-le, et vous aurez un plist avec un tableau d'une ou plusieurs chaînes.

En outre, dans votre exemple de code votre dictionnaire est une fuite de mémoire. Lire sur la gestion de la mémoire en Objective-C, vous allez courir dans beaucoup d'accidents et des problèmes de performance jusqu'à ce que vous le comprenez bien.

Autres conseils

une conversion d'une chaîne à une seule rangée d'éléments avec

[NSArray arrayWithObject:str];

Donc, si vous voulez que votre plist pour contenir les entrées sous forme de tableaux de chaînes, et vous voulez juste une seule chaîne comme un élément, alors vous faites quelque chose comme:

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];

Je ne Nô pas vraiment pourquoi vous voulez cette façon, sauf si vous voulez permettre plusieurs chaînes par clé à un autre moment.

En outre, comme Marc mentionné, vous l'initiale une fuite de (unmutable) dectionary vous créez. Lire les règles de gestion de la mémoire à http://developer.apple. com / documentation / cacao / conceptuel / MemoryMgmt / articles / mmRules.html .

En outre, vous ne devriez jamais écrire dans le pack de votre application. D'une part, l'application peut être sur un volume d'écriture protégée ou l'utilisateur en cours ne peut pas avoir les autorisations pour le changer. D'autre part, le fichier serait alors partagé par tous les utilisateurs. Et un troisième, il briserait la signature de code. Au lieu de cela, écrire le fichier vers le dossier Préférences ou le dossier Application Support.

Et enfin, si ceux-ci sont destinés à être des préférences utilisateur de quelque sorte, vous devez utiliser le système de préférences qui permet la configuration par défaut et stocke les préférences dans le dossier des préférences pour vous. Voir http://developer.apple.com/documentation/Cocoa/Conceptual /UserDefaults/UserDefaults.html pour plus d'informations.

La bonne façon d'enregistrer une NSArray (par lui-même) à un fichier plist est la suivante:

NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];

Cependant, vous ne pouvez pas enregistrer un NSString comme un tableau. Compte tenu de la plist XML que vous avez fourni, si vous voulez ajouter des entrées avec le même format, vous pouvez utiliser ce code beaucoup plus simple:

- (void) writeToFile:(NSString *)string {
  NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
  [dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
  [dictionary writeToFile:plistPath atomically:YES];
}

Ceci permet également d'éviter une fuite de mémoire dans votre code, où le récepteur de -mutableCopy échappe avec un nombre de retenir 1. (Ce n'est pas un problème en GC, mais il est encore une mauvaise pratique.) Vous ne devriez pas avoir besoin d'utiliser +[NSString stringWithFormat:], il suffit d'utiliser une chaîne littérale. Si vous souhaitez utiliser un autre comme la chaîne dans le tableau, vous pouvez passer en tant que paramètre supplémentaire, saisir d'une autre méthode, etc.

Cette méthode est encore fragile en ce qu'elle ne stocke une chaîne dans le tableau associé à la clé donnée - aussi, le nom de la méthode serait mieux si elle était plus indicative exactement ce qu'il fait. De plus, s'il n'y aura que jamais une valeur de chaîne pour chaque touche, vous pouvez envisager la révision de la plist d'omettre les tableaux tout à fait, car il mâche juste l'espace et complique le code.

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