dealloc() non exécuté

Bonjour,



J'inscris certains de mes objets au centre de notification dans init ou awakeFromNib et cela fonctionne bien.



Je souhaite les désinscrire avant leur disparition (sinon à  la prochaine notification => boom). Pour cela je souhaite utiliser la fonction dealloc de l'objet.



J'ai placé un breakpoint dans le dealloc des objets. Mais la fonction n'est pas appelée. Et il me semble que c'est ainsi pour tous mes objets, l'application n'y passe pas !!



Je précise que ARC n'est pas actif.



Une idée ?



Merci à  tous.

Réponses

  • Soit tes retain / release sont mal équilibré (et donc pas de passage à  0 donc de dealloc).



    Soit tu es à  la fermeture de l'application et c'est tout à  fait normal. Lorsqu'une application Cocoa est fermé, les message de fin d'application sont envoyé pour effectuer les sauvegardes mais aucun objet ne recevra le dealloc. Une fois que tous les objets ont répondu aux message de fin d'application la mémoire de l'application est juste dégagé sans que les dealloc soient fait.



    C'est une question d'optimisation. Dans le dealloc ne doit se trouver que la libération mémoire, le cycle de vie de l'application et des objets propose d'autres étapes pour sauvegarder les données par exemple.



    Concernant ton cas de notification, si c'est l'arrêt des notif en fin d'application, tu t'en fou donc. Si c'est en milieu de vie, c'est que tu n'as pas fait suffisamment de release.
  • Yoann, je comprends tout-à -fait ton explication et j'avais déjà  noté dans la doc Apple que lorsqu'on quitte l'application Cocoa ne perd pas de temps à  appelé les Dealloc.



    Cependant j'utilise le NSPersistentDocument de Cocoa sans avoir rien modifié du fonctionnement et si je ferme l'unique fenêtre du document il n'y a pas de passage dans le dealloc que j'ai simplement implémenté ainsi :
    <br />
    -(void)dealloc {<br />
       <br />
        [super dealloc];<br />
    }<br />
    




    Je n'ai pas fait de retain ou release au NSPersistentDocument.
  • Et pourquoi la fermeture d'une fenêtre devrait libérer un document ?
  • Yoann,



    Tu as raison.

    Mon Document était en @property d'un autre objet en mode retain.

    Une fois passé en assign pas de problème.



    Le reste doit être du même acabit.



    Encore merci pour tes conseils.
  • 'jpimbert' a écrit:


    Et pourquoi la fermeture d'une fenêtre devrait libérer un document ?




    Par ce qu'on est dans une application document-based ?
  • 'fleurantin' a écrit:


    Yoann,



    Tu as raison.

    Mon Document était en @property d'un autre objet en mode retain.

    Une fois passé en assign pas de problème.



    Le reste doit être du même acabit.



    Encore merci pour tes conseils.




    Parfait :-)
  • 'yoann' a écrit:


    Par ce qu'on est dans une application document-based ?


    Je connais pas trop le développement MacOSX. Je croyais justement qu'on pouvait ouvrir plusieurs fenêtres sur un document. Du coup je ne voyais pas pourquoi la fermeture d'une fenêtre devait fermer un document.
  • 'jpimbert' a écrit:


    Je connais pas trop le développement MacOSX. Je croyais justement qu'on pouvait ouvrir plusieurs fenêtres sur un document. Du coup je ne voyais pas pourquoi la fermeture d'une fenêtre devait fermer un document.




    Si un document a plusieurs fenêtres d'ouvertes, celui-ci est releasé lors de la fermeture de la dernière fenêtre.



    Il est possible de désigner une fenêtre principale (généralement celle ouverte à  la création du document) :
    <br />
    - (void)windowControllerDidLoadNib:(NSWindowController *) aController<br />
    {<br />
        [super windowControllerDidLoadNib:aController];<br />
    [aController setShouldCloseDocument:YES]; // permet de fermer toutes les fenêtres du document<br />
    




    Ainsi la fermeture de la fenêtre principale entrainera la fermeture de toutes les fenêtres associées à  ce document.
Connectez-vous ou Inscrivez-vous pour répondre.