2010-11-13 50 views
7

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

Répondre

7

C'est mauvais car au moment où -dealloc est appelé, d'autres objets ont abandonné l'intérêt. Cela peut avoir beaucoup d'implications différentes.

Le meilleur endroit pour définir les valeurs par défaut est le moment même où un paramètre change. De cette façon, il persiste tout de suite et l'application peut être supprimée sans crainte qu'un paramètre ne soit pas conservé car des parties de votre graphique d'objets ont déjà disparu.

0

La synchronisation des valeurs par défaut de l'utilisateur dans -dealloc n'est pas différente de nulle part ailleurs. C'est parce que, aussi fou que cela puisse paraître, -dealloc n'est en aucun cas magique, et contrairement aux destructeurs C++, -dealloc est en fait une méthode typique. Vous pourriez être légèrement plus inquiet de passer self.filenamesArray à userDefualts, parce que c'est en fait quelque chose qui peut être maintenu après la désallocation réelle, mais je crois que les valeurs par défaut de l'utilisateur le conserve. Quand vous devriez [userDefaults synchronize];, les gens varient, et personnellement je ne suis pas d'accord avec @Joshua - je ne synchronise jamais explicitement, mais je laisse plutôt NSUserDefaults en prendre soin. À moins que je ne me trompe, il se déclenche automatiquement lorsque l'application se ferme, ainsi que périodiquement autrement. Comme il sait quand il a été mis à jour, et qu'il a besoin d'écrire le fichier plist en même temps, je pense que je préférerais laisser les algos d'Apple gérer quand il faut écrire les valeurs par défaut, car cela prend un temps non trivial écrit dans le système de fichiers).

(Notez qu'aucun du dernier paragraphe applique si vous avez des circonstances particulières entourant vos paramètres utilisateur par défaut, comme une autre lecture de l'application/les écrire)

+0

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

+0

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

+0

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