2010-11-13 14 views
7

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. :)

Respuesta

7

Es malo porque para cuando se llama -dealloc, otros objetos han perdido interés en él. Esto puede tener muchas implicaciones diferentes.

El mejor lugar para establecer los valores predeterminados del usuario es el momento en que cambia la configuración. De esta forma, persiste de inmediato y la aplicación puede ser eliminada sin preocuparse de que una configuración no se mantenga porque partes de su gráfico de objetos ya se habrán retirado.

0

La sincronización de los valores predeterminados del usuario en -dealloc no es diferente de cualquier otro lugar. Esto se debe a que, por loco que pueda parecer, -dealloc no es de ninguna manera mágico, ya diferencia de, por ejemplo, los destructores de C++, -dealloc es en realidad un método típico. Podría estar un poco más preocupado por pasar self.filenamesArray a userDefualts, porque eso es algo que puede retenerse después de la desasignación real, pero confío en que el usuario lo retiene por defecto.

En cuanto a cuándo debe [userDefaults synchronize];, las personas varían, y yo personalmente no estoy de acuerdo con @Joshua - nunca sincronizo explícitamente, sino que dejo que NSUserDefaults se ocupe de ello. A menos que esté muy equivocado, se dispara automáticamente cuando se cierra la aplicación, y periódicamente de lo contrario. Como sabe cuándo se ha actualizado, y necesita escribir todo el archivo plist a la vez, creo que preferiría manejar el algos de Apple cuando llega el momento de escribir los valores predeterminados, ya que es un tiempo no trivial (porque escribe en el sistema de archivos).

(Tenga en cuenta que ninguno del último párrafo se aplica si usted tiene circunstancias especiales que rodean a sus valores predeterminados de usuario, tales como otra lectura application/escribirlos)

+0

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

+0

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

+0

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

Cuestiones relacionadas