[Gestion Mémoire] Libérer les statiques et singleton ?

ClicCoolClicCool Membre
novembre 2009 modifié dans API AppKit #1
Bonjour,

Je sais bien qu'à  la fermeture d'une appli toute sa mémore est libérée d'un coup sans procéder aux dealloc un par un.

Pourtant je ne peut m'empécher de coder le dealloc de mon App Delegate par exemple, qui pourtant ne sera libéré qu'au moment de quitter l'appli...

Mais comment faire alors pour libérer quelques objjets statiques alloués dans le initialize d'une classe ?
Est-ce bien judicieux de le faire du reste ?

Et à  ce sujet quelles sont vos habitudes ?
  • Vous laisser la fermeture de l'appli libérer tous les objets 'root' ?
  • Vous codez un dealloc pour tous les objets qui ne seront désalloué qu'en fin de programme ?

Réponses

  • Philippe49Philippe49 Membre
    22:57 modifié #2
    dans 1257331748:

    Mais comment faire alors pour libérer quelques objjets statiques alloués dans le initialize d'une classe ?
    Est-ce bien judicieux de le faire du reste ?

    On ne peut libérer que des objets qui ont été créées de manière dynamique , c'est-à -dire que l'on a fait un alloc ou un malloc .
  • ClicCoolClicCool Membre
    22:57 modifié #3
    dans 1257332318:

    dans 1257331748:

    Mais comment faire alors pour libérer quelques objjets statiques alloués dans le initialize d'une classe ?
    Est-ce bien judicieux de le faire du reste ?

    On ne peut libérer que des objets qui ont été créées de manière dynamique , c'est-à -dire que l'on a fait un alloc ou un malloc .


    Ben, y'a pas d'alloc quand dans l'Initialize d'une classe j'ai un:
    <br />	typeAttrb = [[NSDictionary alloc ] initWithObjectsAndKeys:[NSColor redColor], NSForegroundColorAttributeName,<br />				&nbsp;  [NSFont fontWithName:@&quot;Baskerville&quot; size: 18], NSFontAttributeName, NULL];
    
      ???
  • mpergandmpergand Membre
    22:57 modifié #4
    Salut clicCool,

    Tu dois pouvoir faire: [typeAttrb release] dans dealloc

    Sauf que je viens de faire un test:
    @implementation AppDelegate<br /><br />-(void) awakeFromNib<br />{<br />	NSLog(@&quot;awake&quot;);<br />}<br /><br />-(void) dealloc<br />{<br />	[super dealloc];<br />	<br />	NSLog(@&quot;dealloc&quot;);<br />}<br /><br /><br />@end<br />
    


    Je quitte l'appli et dans les logs j'ai:

    [Session started at 2009-11-04 12:14:32 +0100.]
    2009-11-04 12:14:32.119 test [447:10b] awake

    test has exited with status 0.

    ;D
  • Philippe49Philippe49 Membre
    22:57 modifié #5
    En même temps EXIT_SUCCESS=0
  • AliGatorAliGator Membre, Modérateur
    22:57 modifié #6
    C'est marrant, je me posais la même question justement hier.
    D'autant que si c'est juste un release pour libérer la mémoire, qu'il soit fait ou que l'objet soit libéré par un ménage "global" à  la fermeture de l'appli, ça n'a pas trop d'incidence.

    Mais j'ai des objets qui font quand même des choses importantes dans leur dealloc. Par exemple un objet manipulant un socket, je fait un close() sur le socket quand l'objet est désalloué. Si je ne fais pas le close(), le socket est bloqué (et le système met du temps à  le relâcher, ce qui peut en plus bloquer un lancement suivant de l'appli, embêtant !!)

    Du coup parfois c'est problématique que le dealloc ne soit pas appelé... Mais tu as toujours la méthode de l'ApplicationDelegate "applicationWillTerminate" qui te permet de t'en sortir et de quand même faire des choses avant que l'appli ne quitte.
  • ClicCoolClicCool Membre
    22:57 modifié #7
    Lors de la fermeture d'une appli les déalloc ne sont pas appelés, tout est libéré en un coup (je crois que c'est documenté dans la doc du reste)



    dans 1257333735:

    Tu dois pouvoir faire: [typeAttrb release] dans dealloc.../...


    Dans le dealloc de quoi ?
    ici typeAttrb est une statique de la classe initialisée dans le +(void)Initialize de la classe.
    Pas question que le dealloc d'une 'simple' instance relache cette statique ...
  • AliGatorAliGator Membre, Modérateur
    novembre 2009 modifié #8
    dans 1257334808:

    Lors de la fermeture d'une appli les déalloc ne sont pas appelés, tout est libéré en un coup (je crois que c'est documenté dans la doc du reste)
    Tout à  fait, on est bien d'accord.

    C'est pour cela que je te parlais de l'alternative applicationWillTerminate: de NSApplicationDelegate (ou UIApplicationDelegate pour iPhone).
  • ClicCoolClicCool Membre
    novembre 2009 modifié #9
    dans 1257335089:
    .../...
    C'est pour cela que je te parlais de l'alternative applicationWillTerminate: de NSApplicationDelegate (ou UIApplicationDelegate pour iPhone).


    Absolument d'accord moi aussi  ;)
  • ClicCoolClicCool Membre
    22:57 modifié #10
    dans 1257331748:
    .../...
    Et à  ce sujet quelles sont vos habitudes ?
    • Vous laisser la fermeture de l'appli libérer tous les objets 'root' ?
    • Vous codez un dealloc pour tous les objets qui ne seront désalloué qu'en fin de programme ?

  • mpergandmpergand Membre
    novembre 2009 modifié #11

    Dans le dealloc de quoi ?
    ici typeAttrb est une statique de la classe initialisée dans le +(void)Initialize de la classe.
    Pas question que le dealloc d'une 'simple' instance relache cette statique ...


    Ici tu parles d'un appDelegate donc il n'y a qu'une seule instance, ce qui limite l'utilité des statiques ...


    Je pense qu'il n'y a pas 36 solutions, comme le dit Aligator "applicationWillTerminate" is the way to go  ;)
  • ClicCoolClicCool Membre
    novembre 2009 modifié #12
    dans 1257335728:

    dans 1257333735:

    Tu dois pouvoir faire: [typeAttrb release] dans dealloc.../...


    Ici tu parles d'un appDelegate donc il n'y a qu'une seule instance, ce qui limite l'utilité des statiques ...


    Je pense qu'il n'y a pas 36 solutions, comme le dit Aligator "applicationWillTerminate" is the way to go  ;)


    Oups, je me suis mal exprimmé  B)

    Je parlais du problème de la libération d'objects comme l'AppDelagate mais aussi d'Objects statiques d'autres classes.
    Ici, précidemment, typeAttrb est une statique d'une classe mère ayant de nombreuses sous classes, elles mêmes étant instanciées de nombreuses fois.




    P.S. je manque à  tous mes devoirs !
    Content de te lire MPergand  <3 <br />(Les routes risquent toujours d'être mouillées quand il pleut ? ) (PJ)
  • mpergandmpergand Membre
    22:57 modifié #13
    dans 1257336003:

    P.S. je manque à  tous mes devoirs !
    Content de te lire MPergand  <3 <br />(Les routes risquent toujours d'être mouillées quand il pleut ? ) (PJ)


    C'est la 2e fois que tu me la fais, mais je comprends toujours rien  :)
  • ClicCoolClicCool Membre
    22:57 modifié #14
    dans 1257336490:

    dans 1257336003:

    P.S. je manque à  tous mes devoirs !
    Content de te lire MPergand  <3 <br />(Les routes risquent toujours d'être mouillées quand il pleut ? ) (PJ)


    C'est la 2e fois que tu me la fais, mais je comprends toujours rien  :)


    Pour dire vrai je me souviens plus très bien d'où m'était partie ce joke.  :P
    Il me semble que c'était en rapport avec un de tes anciens avatar ?  ... (un panneau de signalisation ou un truc du genre non ?)
  • mpergandmpergand Membre
    22:57 modifié #15
    dans 1257336969:

    Pour dire vrai je me souviens plus très bien d'où m'était partie ce joke.  :P
    Il me semble que c'était en rapport avec un de tes anciens avatar ?  ... (un panneau de signalisation ou un truc du genre non ?)

    ???  je n'utilise jamais d'avatar !

    pour revenir au sujet:
    Une alternative possible est que toutes les fenêtres ouvertes reçoivent un close et donc il est possible d'intercepter l'événement via un window delegate.
  • AliGatorAliGator Membre, Modérateur
    22:57 modifié #16
    Si ça ne t'arrange pas de tout centraliser dans le applicationDelegate, note (c'est indiqué dans la doc) que tu peux aussi te mettre à  l'écoute de la notification NSApplicationWillTerminateNotification (UIApplicationWillTerminateNotification sur iPhone).

    Donc à  priori il suffit, pour chaque objet pour lequel tu veux faire un truc particulier à  la fermeture de l'appli, de mettre le code adéquat dans la méthode que tu associes à  ta notification en plus ou à  la place de le mettre dans le dealloc (selon le cas).
    Bon attention, je ne suis pas sûr que l'ordre d'appel soit fiable : si tu as plusieurs observeurs de ta notification, vérifier que ça ne risque pas d'être appelé deux fois (et dans quel ordre, pas forcément défini) sur la superclass si à  la fois ta classe et sa superclass sont observer... ce genre de trucs, quoi, si tu as des objets dépendants les uns des autres, ça ne va pas forcément suivre la hiérarchie selon la façon dont tu vas coder ça.

    Mais bon ça me semble une alternative intéressante si ça peut te faciliter la vie.
  • ClicCoolClicCool Membre
    22:57 modifié #17
    Ben, je cherche à  faire propre plus qu'à  me faciliter la vie.

    Mon soucis c'est qu'il est hors de question de relacher mes statiques tant qu'il reste, ne serait-ce qu'une seule instance des classes filles en circulation, ce que applicationWillTerminate: ou la notif NSApplicationWillTerminateNotification ne me garantissent pas il me semble ...
Connectez-vous ou Inscrivez-vous pour répondre.