cargo desde NSUserDefaults en el método init de mi objeto. ¿Puedo guardar en NSUserDefaults en el método dealloc de mi objeto?¿Es malo sincronizar NSUserDefaults en - (void) dealloc?
Algo exactamente igual:
-(void)dealloc {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
[userDefaults synchronize];
self.filenamesArray = nil;
self.defaultsKey = nil;
[super dealloc];
}
bueno, malo, ok? si no es bueno, dónde sería mejor.
Edit:
Gracias por las respuestas detalladas. Todas esas cosas tienen sentido. Otra razón por la que descubrí por qué este es un mal lugar para guardar en los valores predeterminados del usuario, es que dealloc solo se invoca cuando un objeto se desasigna fácilmente. Si mi aplicación es asesinada, este código nunca se ejecuta. Del mismo modo, si la aplicación se coloca en segundo plano (iOS 4), esto no se ejecuta. También eliminé la llamada explícita [userDefaults synchronize]
. Me pone un poco nervioso, pero confío en la manzana en este caso. :)
Estoy de acuerdo con Jared, 'synchronize' sólo debe utilizarse para "forzar "sincronizando. Esto puede ser útil, por ejemplo, cuando se depura y existe la posibilidad de fallar, etc. – mohsenr
No recuerdo que alguien haya presentado -dealloc como "mágico". El punto es que, en general, es una mala práctica específicamente porque esta parte de su gráfico de objetos se está derribando. Hacer otra cosa que no sea derribar (como quitarse de un centro de notificaciones, etc.) crea un área más de su aplicación que podría funcionar mal a medida que su clase se vuelve más compleja. Especialmente cuando considera referencias débiles a otros objetos que ya pueden haber desaparecido cuando se llama a -dealloc de este objeto. El código como se ve ahora parece inofensivo, pero eso podría cambiar fácilmente. –
Lo dicho anteriormente (se agotó el espacio), acepto que la llamada a "sincronizar" no es necesaria; sin embargo, establecer el usuario por defecto es lo que más me preocupa. El OP no solo está llamando a sincronización, está esperando establecer los valores predeterminados durante una llamada -dealloc. Cambié la redacción de mi respuesta original para reflejar esta distinción. –