Come faccio a memorizzare una stringa come una matrice in un elenco delle proprietà di cacao?

StackOverflow https://stackoverflow.com/questions/972605

Domanda

Sto cercando di salvare due stringhe. Una stringa deve essere salvata come tipo ARRAY nel plist e la seconda stringa deve essere salvata come stringa nella matrice.

posso utilizzare il codice:

[dizionario setObject: (id) anObject Forkey: (id) aKey>]

, ma non salva correttamente. Posso lanciare una delle stringhe come un array, ma ancora non funziona bene.

Qual è il metodo corretto per il salvataggio di una matrice per il plist?

Ecco quello che il mio plist appare come:

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

Ecco il metodo che sto usando per cercare di

-(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];
}
È stato utile?

Soluzione

Non puoi lanciare o comunque convertire una stringa in un array; sono, oggetti distinti separati. E 'lo stesso come se nella vita reale si tenta di trasformare il vostro cane in una station wagon, che non sta accadendo.

Al contrario, mettere il vostro cane all'interno della station wagon (o mettere la stringa (s) all'interno di un array). È possibile creare l'array con [NSArray arrayWithObjects:@"string1", @"string2", nil];. Stick che dentro il dizionario per una data chiave, insieme con la stringa finale per un altro tasto, salvarlo, e avrete un plist con una serie di una o più stringhe.

Inoltre, nel tuo esempio di codice il dizionario perde la memoria. Leggere su gestione della memoria in Objective-C, si sta andando a correre in un sacco di crash e problemi di prestazioni fino a comprendere bene.

Altri suggerimenti

È un convertire una stringa in un singolo array elemento con

[NSArray arrayWithObject:str];

Quindi, se si desidera che il plist per contenere le voci come array di stringhe, e si desidera solo una singola stringa come elemento, poi si fa qualcosa di simile:

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

Non In realtà no perché si vuole in questo modo a meno che non si desidera consentire a più stringhe per chiave in un altro momento.

Inoltre, come Marc accennato, si sono perdite iniziali (unmutable) dectionary si crea. Leggere le norme di gestione della memoria a http://developer.apple. com / documentazione / cacao / concettuale / MemoryMgmt / articoli / mmRules.html .

Inoltre, non si dovrebbe mai scrivere dentro al pacchetto dell'applicazione. Per prima cosa, l'applicazione può essere su un volume protetto da scrittura o l'utente corrente non può avere i permessi per cambiarlo. Per un altro, il file sarebbe poi essere condiviso da tutti gli utenti. E per un terzo, si spezzerebbe la firma del codice. Invece, scrivere il file o la cartella Preferenze o la cartella Application Support.

E, infine, se questi sono destinati ad essere le preferenze degli utenti di qualche tipo, allora si dovrebbe utilizzare il sistema delle preferenze, che permette di default la configurazione e memorizza le preferenze nella cartella Preferenze per voi. Vedere http://developer.apple.com/documentation/Cocoa/Conceptual /UserDefaults/UserDefaults.html per ulteriori informazioni.

Il modo corretto per salvare un NSArray (da solo) in un file plist è la seguente:

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

Tuttavia, non è possibile salvare un NSString come una matrice. Dato il plist XML che hai fornito, se si desidera aggiungere voci con lo stesso formato, è possibile utilizzare questo codice molto più semplice:

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

Questo evita anche una perdita di memoria nel codice, in cui il ricevitore di -mutableCopy fugge con un conteggio di conservare 1. (Questo non è un problema sotto GC, ma è ancora una cattiva pratica.) Non dovrebbe essere necessario usare +[NSString stringWithFormat:], basta usare una stringa letterale. Se si desidera utilizzare un diverso come la stringa nella matrice, è possibile passare come un parametro aggiuntivo, afferrarlo da un altro metodo, ecc.

Questo metodo è ancora fragile in quanto esso memorizza solo una stringa nella matrice abbinato con il tasto proposta - anche, il nome del metodo sarebbe meglio se fosse più indicativo di esattamente ciò che fa. Inoltre, se ci sarà sempre solo un valore di stringa per ogni tasto, si potrebbe prendere in considerazione una revisione della plist di omettere le matrici del tutto, dal momento che mastica solo spazio e complica il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top