2010-10-29 42 views
3

Selon la documentation de NSObject:Comment vous assurer que votre code dealloc est appelé à la fin de l'application?

Important: Notez que lorsqu'une application se termine, les objets peuvent pas envoyer un message dealloc depuis la mémoire du processus est automatiquement effacé à la sortie --- il est plus efficace simplement pour permettre au système d'exploitation de nettoyer les ressources que d'invoquer toutes les méthodes de gestion de la mémoire .

C'est très bien, mais si mes objets a besoin de faire quelque chose sur dealloc, telles que l'enregistrement de son état sur le disque ou quelque chose connecter? Comment puis-je m'assurer que le code est appelé?

+0

Vous pouvez utiliser NSLog sur la fin et lire le journal après l'application a été terminée pour vérifier si il passe le methos dealloc ou pas. – infinity

Répondre

7

La gestion de la persistance ne doit pas être liée à dealloc. Si vous souhaitez enregistrer l'état de l'objet, vous devez avoir un objet de session qui collecte les objets sales et enregistre les modifications de temps en temps ou lorsque l'application se termine en arrière-plan.

Un exemple utilisant les paramètres d'application: Supposons que vous ne souhaitiez pas utiliser NSUserDefaults pour les paramètres de votre application, peut-être parce que vous avez une logique supplémentaire à faire. Vous avez une classe Settings qui conserve tous les paramètres et vous souhaitez évidemment conserver les modifications persistantes.

Vous pouvez placer toute la logique de persistance dans la classe Settings, mais cela viole le principe de la responsabilité unique. (= Il y a de bonnes raisons pour que cela vous cause de la douleur.) Donc, vous pouvez ajouter une classe Session qui prendra de la persistance des changements effectués dans Settings.

Lorsque l'application démarre, vous allez créer une instance de la Session et demander Settings:

Session *session = [[Session alloc] init]; 
Settings *settings = [session loadSettings]; 

Maintenant, s'il y a un fichier sur le disque qui contient les paramètres enregistrés, la session se charge (ce qui est simple, car la classe Settings implémente NSCoding). Si ce n'est pas le cas, la session créera une nouvelle instance Settings et la renverra. En outre, la session commencera probablement à surveiller les modifications dans l'instance Settings renvoyée, par exemple en utilisant NSNotificationCenter. (Il est tout à fait naturel qu'un objet Settings tireraient une notification lorsque les paramètres changent.)

Maintenant, quand vous changez quelque chose dans une instance Settings que vous avez obtenu de la session, la session remarquerez que et il enregistre les modifications apportées à disque. Ce qui devrait être trivial, puisque Settings mettre en œuvre NSCoding. Vous pouvez également marquer l'objet comme sale et enregistrer uniquement les modifications toutes les quelques secondes, ce qui est une meilleure solution dans le cas où vous mettez à jour l'objet assez fréquemment. Dans ce cas, vous pouvez également forcer la sauvegarde de la session lorsque l'application va se terminer ou passera en arrière-plan.

Je ne dis pas que ce scénario est parfait, mais il est certainement mieux que les objets qui s'obstinent à dealloc :-)

+0

Pourriez-vous élaborer à ce sujet s'il vous plaît? O :-) – cfischer

5

Assurez-vous que l'objet est libéré dans votre applicationWillTerminate: (NSApplicationDelegate).

+1

Il ne doit pas être dans le délégué. Vous pouvez observer NSApplicationWillTerminateNotification sur le centre de notification local. –