Je charge depuis NSUserDefaults dans la méthode init de mon objet. Puis-je sauvegarder dans NSUserDefaults dans la méthode dealloc de mon objet?Est-il mauvais de synchroniser NSUserDefaults dans - (void) dealloc?
Quelque chose comme exactement:
-(void)dealloc {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
[userDefaults synchronize];
self.filenamesArray = nil;
self.defaultsKey = nil;
[super dealloc];
}
bon, mauvais, ok? si ce n'est pas bon, où serait mieux.
Editer:
Merci pour les réponses détaillées. Toutes ces choses ont un sens. Une autre raison pour laquelle j'ai découvert pourquoi il s'agit d'un mauvais endroit pour enregistrer les valeurs par défaut de l'utilisateur, est que dealloc n'est appelé que lorsqu'un objet se désaffecte bien. Si mon application est supprimée, ce code ne s'exécute jamais. De même, si l'application est mise en arrière-plan (iOS 4), cela ne fonctionne pas. J'ai également supprimé l'appel explicite [userDefaults synchronize]
. Ca me rend un peu nerveux, mais j'ai mis ma confiance en Apple sur celui-ci. :)
Je suis d'accord avec Jared, 'synchronize' ne doit être utilisé à la « force "synchronisation" Cela peut être utile par exemple lors du débogage et il y a une chance de s'écraser, etc. – mohsenr
Je ne me souviens pas que quiconque ait présenté -dealloc comme "magique". Le fait est que c'est généralement une mauvaise pratique parce que cette partie de votre graphe d'objets est en train d'être détruite. Faire autre chose que de démonter (comme se retirer d'un centre de notification, etc.) crée une autre zone de votre application qui pourrait mal se comporter à mesure que votre classe devient plus complexe. Surtout quand vous considérez les références faibles à d'autres objets qui peuvent déjà avoir passé au revoir au moment où le -dealloc de cet objet est appelé. Le code tel qu'il est maintenant semble inoffensif mais cela pourrait facilement changer. –
Le dit ci-dessus (a couru hors de la pièce), je suis d'accord que l'appel à -synchroniser est inutile, mais la configuration par défaut de l'utilisateur est ce que j'ai principalement le problème avec. L'OP ne se contente pas d'appeler synchroniser, il attend pour définir les valeurs par défaut lors d'un appel -dealloc. J'ai changé le libellé de ma réponse originale pour refléter cette distinction. –