Frage

Ich versuche, zwei Strings zu speichern. Eine Zeichenfolge muss als Typ ARRAY im pList gespeichert werden und die zweite Zeichenfolge muss als String in dem Array gespeichert werden.

Ich kann den Code verwenden:

[Wörterbuch setObject: (id) anObject forKey: (id) aKey>]

, aber es speichert nicht es richtig. Ich kann eine der Saiten als Array geworfen, aber es funktioniert immer noch nicht richtig funktioniert.

Was ist die richtige Methode für ein Array an die pList speichern?

Hier ist, was mein pList wie folgt aussieht:

<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>

Hier ist die Methode, die ich zu

, um zu versuchen bin mit
-(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];
}
War es hilfreich?

Lösung

Sie können nicht gegossen oder auf andere Weise einen String in ein Array umwandeln; sie sind getrennt, verschiedene Objekte. Es ist das gleiche, wie wenn im wirklichen Leben Sie versuchen, Ihren Hund in einen Kombi zu drehen, es ist nicht passiert.

Stattdessen setzen Sie Ihren Hund in der Kombi (oder setzen Sie Ihre Saite (n) innerhalb eines Arrays). Sie können das Array mit [NSArray arrayWithObjects:@"string1", @"string2", nil]; erstellen. Halten Sie, dass in Ihrem Wörterbuch für einen bestimmten Schlüssel, zusammen mit Ihrer letzten Zeichenfolge für eine andere Taste, speichern Sie es, und Sie werden eine plist mit einer Reihe von einer oder mehreren Saiten haben.

Auch in Ihrem Codebeispiel Ihr Wörterbuch ist undicht Speicher. Informieren Sie sich über die Speicherverwaltung in Objective-C, Sie gehen in viele Abstürze und Performance-Probleme laufen, bis Sie es gut verstehen.

Andere Tipps

Sie ein konvertieren eine Zeichenfolge auf ein einzelnes Element Array mit

[NSArray arrayWithObject:str];

Wenn Sie also Ihre plist wollen Einträge als Arrays von Zeichenketten enthalten, und Sie wollen einfach nur eine einzelne Zeichenfolge als ein Element, dann sind Sie so etwas wie:

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

ich nicht eigentlich keine, warum Sie es so wollen würde, wenn Sie für mehrere Saiten pro Taste zu einem anderen Zeitpunkt zulassen möchten.

Auch, wie Marc erwähnt, Sie sind undicht die anfängliche (unmutable) dectionary Sie erstellen. Lesen Sie die Speicherverwaltung Regeln unter http://developer.apple. com / Dokumentation / Cocoa / Conceptual / MemoryMgmt / Artikel / mmRules.html .

Außerdem sollten Sie nie in Ihrer Anwendung Bündel schreiben. Für eine Sache, Ihre Anwendung auf einem schreibgeschützten Volume oder den aktuellen Benutzer möglicherweise nicht über Berechtigungen, es zu ändern sein. Zum anderen würde die Datei dann von allen Benutzern gemeinsam genutzt werden. Und zum dritten, würde es die Codesignatur brechen. Stattdessen schreiben die Datei entweder mit dem Preferences-Ordner oder dem Ordner Application Support.

Und schließlich, wenn diese sollen Benutzereinstellungen von einer Art sein, dann sollten Sie die Systemeinstellungen verwenden, die Konfiguration von Standardeinstellungen ermöglicht und speichert die Einstellungen in den Preferences-Ordner für Sie. Siehe http://developer.apple.com/documentation/Cocoa/Conceptual für weitere Informationen /UserDefaults/UserDefaults.html.

Die richtige Art und Weise ein NSArray (selbst) auf eine plist-Datei zu speichern ist wie folgt:

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

Sie können jedoch kein NSString als Array speichern. Gegeben Sie die XML plist bereitgestellt, wenn Sie Einträge mit dem gleichen Format hinzufügen möchten, können Sie diese viel einfacher Code verwenden:

- (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];
}

Dies vermeidet auch ein Speicherleck im Code, wo der Empfänger von -mutableCopy mit einem Beibehaltungszähler von 1 entweicht (Dies ist kein Problem unter GC ist, aber es ist immer noch ein schlechte Praxis.) Sie sollten nicht verwenden müssen +[NSString stringWithFormat:], verwenden Sie einfach einen Stringliteral. Wenn Sie eine andere als die Zeichenfolge in dem Array verwenden möchten, können Sie entweder es passieren in als zusätzlicher Parameter, es von einer anderen Methode greifen, etc.

Dieses Verfahren noch brüchig ist, dass es nur speichert eine Zeichenfolge in dem Feld mit dem angegebenen Schlüssel abgestimmt - auch, würde der Name die Methode besser, wenn es mehr anzeigt, genau ist, was sie tut. wenn es auch immer nur ein String-Wert für jeden Schlüssel sein, könnten Sie betrachten die plist Überarbeitung die Arrays ganz wegzulassen, da es nur Platz kaut und erschwert den Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top