Estoy construyendo un modelo para MVC y estoy experimentando una anomalía donde al contrario de Apple Documentation"Los valores devueltos de NSUserDefaults son inmutables, incluso si establece un objeto mutable como el valor.", [[NSUserDefaults standardUserDefaults] objectForKey: @ "clave"] está devolviendo una matriz mutable.NSUserDefaults está devolviendo una matriz mutable
Creé una aplicación vacía para iOS en Xcode 4D199 para volver a crear la condición y confirmar que no es responsable de otros factores en mi proyecto.
estoy fijando la NSMutableArray como se muestra:
- (void)setupTest
{
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:@"one"];
[mutableArray addObject:@"two"];
[[NSUserDefaults standardUserDefaults] setObject:mutableArray forKey:@"mutableArray_01"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
y, estoy consiguiendo el objeto como se muestra:
- (void)checkTest
{
NSMutableArray *mutableArrayInCheck = nil;
id whatIsThis = [[NSUserDefaults standardUserDefaults] objectForKey:@"mutableArray_01"];
if([whatIsThis isKindOfClass:[NSMutableArray class]])
{
NSLog(@"The array is mutable.");
mutableArrayInCheck = (NSMutableArray *)whatIsThis;
}
if([whatIsThis isKindOfClass:[NSArray class]])
{
NSLog(@"The array is immutable.");
}
if ([whatIsThis isMemberOfClass:[NSMutableArray class]])
{
NSLog(@"The array is a member of NSMutableArray class");
}
if (mutableArrayInCheck)
{
[mutableArrayInCheck addObject:@"three"];
NSLog([mutableArrayInCheck description]);
}
}
Ahora, de acuerdo con la documentación de manzana, uno esperaría que la consola solo muestra la línea inmutable . Pero cuando ejecuto el código, las siguientes líneas se muestran en la consola:
2012-01-05 18:47:33.328 Tester_01[78533:f803] The array is mutable.
2012-01-05 18:47:33.348 Tester_01[78533:f803] The array is immutable.
2012-01-05 18:47:33.349 Tester_01[78533:f803] (
one,
two,
three
)
lo tanto, me gustaría saber si hay algo que me falta aquí.
Para obtener información adicional, el código que ejecuta las pruebas es como se muestra:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL setupKey = NO;
if (setupKey)
{
[self setupTest];
}
BOOL checkKey = YES;
if (checkKey)
{
[self checkTest];
}
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Inicialmente, me encontré con el proyecto con ClaveKmsDeConfiguración conjunto de SÍ. Después de la primera ejecución, cambié el setupKey a NO. El registro de la consola es un resultado, mientras que el setupKey se configuró en NO. Déjame saber lo que piensas.
supongo que sólo quieren decir que debiera No cuente con obtener una matriz mutable. En mis proyectos, a menudo solo asigno un 'NSMutableArray' a un puntero' NSArray', porque hacer '[NSArray arrayWithArray: mutableArray]' solo agregaría overhead, con muy poco beneficio. – mvds
solo una conjetura: reinició la aplicación después de agregar la matriz mutable a los valores predeterminados del usuario y luego de leerla sin configurarla nuevamente. Puedo obtener imágenes, que el objeto permanece igual durante una sesión hasta que se serializó y se escribió en el disco y se volvió a leer. – vikingosegundo
Sí, como expliqué al final de la pregunta, con *** setupKey *** establecido en ** YES **, configuré la matriz mutable la primera vez que ejecuté la aplicación. Después de eso, configuré *** setupKey *** en ** NO **, luego reinicié la aplicación para obtener la salida de la consola descrita anteriormente. – Jin