Pregunta

Estoy tratando de salvar a dos cadenas. Una cadena necesita ser guardado como tipo de array en el plist y la segunda cadena necesita ser guardado como cadena de la matriz.

Puedo usar el código:

[diccionario setObject: (id) unObjeto forKey: (id) Akey>]

pero no guarda correctamente. Puedo lanzar una de las cadenas como una matriz, pero aún no funciona bien.

¿Cuál es el método adecuado para guardar una matriz para la PLIST?

Esto es lo que mi PLIST se ve así:

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

Este es el método que estoy utilizando para tratar a

-(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];
}
¿Fue útil?

Solución

No se puede emitir o no convertir una cadena en una matriz; son objetos separados y distintos. Es lo mismo que si en la vida real intenta dar vuelta a su perro en una camioneta, que no está sucediendo.

En su lugar, poner a su perro en el interior de la camioneta (o poner su cadena (s) dentro de una matriz). Puede crear la matriz con [NSArray arrayWithObjects:@"string1", @"string2", nil];. Palo que dentro de su diccionario para una clave dada, junto con su cadena final de otra tecla, guardarlo, y tendrá un plist con un conjunto de una o más cadenas.

Además, en el ejemplo de código su diccionario está perdiendo memoria. Lea sobre la gestión de memoria en Objective-C, que va a encontrarse con un montón de accidentes y problemas de rendimiento hasta que entienda bien.

Otros consejos

una convertir una cadena en una sola matriz elemento con

[NSArray arrayWithObject:str];

Así que si usted quiere que su plist que contiene entradas como matrices de cadenas, y sólo desea una sola cadena como un elemento, y luego haces algo como:

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

No en realidad no hay por qué desea de esta manera a menos que desee para permitir múltiples cuerdas por tecla en algún otro momento.

Además, como se mencionó Marc, se filtra la inicial (unmutable) dectionary se crea. Lea las normas de gestión de memoria en http://developer.apple. com / documentación / Cacao / conceptual / MemoryMgmt / Artículos / mmRules.html .

Además, nunca se debe escribir en el interior paquete de la aplicación. Por un lado, su aplicación puede estar en un volumen protegido contra escritura o el usuario actual puede no tener permisos para cambiarlo. Por otra parte, el archivo a continuación, sería compartido por todos los usuarios. Y para una tercera, se rompería la firma de código. En su lugar, escribir el archivo a la carpeta Preferencias o en la carpeta Application Support.

Y, por último, cuando se destinen a ser las preferencias de usuario de algún tipo, entonces debe usar el sistema de preferencias, lo que permite la configuración por defecto y almacena las preferencias en la carpeta de preferencias para usted. Ver http://developer.apple.com/documentation/Cocoa/Conceptual /UserDefaults/UserDefaults.html para más información.

La forma correcta de guardar un NSArray (por sí mismo) a un archivo plist es el siguiente:

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

Sin embargo, no se puede guardar un NSString como una matriz. Dado el plist XML que ya ha proporcionado, si desea agregar entradas con el mismo formato, puede utilizar este código mucho más 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];
}

Esto también evita una pérdida de memoria en su código, en el que el receptor de -mutableCopy escapa con una cuenta de retención de 1. (Esto no es un problema bajo GC, pero aún así es una mala práctica.) No debería ser necesario utilizar +[NSString stringWithFormat:], sólo tiene que utilizar una cadena literal. Si desea utilizar una distinta como la cadena en la matriz, puede pasarlo en como parámetro adicional, agarrarlo desde otro método, etc.

Este método sigue siendo frágil, ya que sólo almacena una cadena de la matriz coincide con la clave dada - También, el nombre del método sería mejor si fuera más indicativo de exactamente lo que hace. Además, si sólo habrá alguna vez un valor de cadena para cada tecla, usted podría considerar la revisión de la plist omitir las matrices del todo, ya que solo mastica espacio y complica el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top