Surveiller ses dealloc

MalaMala Membre, Modérateur
août 2012 modifié dans Objective-C, Swift, C, C++ #1
Je pensais vous livrer cette catégorie l'autre soir mais je me suis rendu compte que j'avais un problème avec les héritages. Du coup, j'ai préféré supprimer mon poste en attendant. Voilà  qui est corrigé ce soir. Cette catégorie est un peu dans l'esprit de ce qu'a fait Ali dans ce poste mais dans le sens préventif.



Une règle de codage des "vétérans" c'est de mettre systématiquement un pointeur à  nil après un release. On évite ainsi bien des surprises de violations d'accès. Cette catégorie se base sur ce postula pour surveiller et afficher un log lors d'une déallocation suspecte.



Pour l'utiliser, il suffit d'implémenter la méthode "deallocControl:" de la sorte dans la classe que l'on veut surveiller:
<br />
- (void) dealloc<br />
{<br />
    [myString release];<br />
    myString = nil;<br />
<br />
    // Oups on oublie de libérer un objet<br />
    //[myString2 release];<br />
    //myString2 = nil;<br />
<br />
    // Notre ceinture de sécurité...<br />
    [MaClasse deallocControl:self];<br />
<br />
    [super dealloc];<br />
}<br />




A l'exécution, dès que l'objet est libéré, on a un joli log:
Console d&#39 a écrit: »


Class "MaClasse" - Instance variable "myString2" != nil - Potential memory leak?




Une fois le développement du projet terminé, il suffit de passer le define "DEALLOC_CONTROL_ACTIVATED" à  0 dans le .h de la catégorie pour éviter toute perte de performances du fait des contrôles. Cette approche me plaà®t bien car elle reste dans l'esprit de la gestion mémoire manuelle d'Obj-C avec un côté "conduite accompagnée".



J'espère que cela sera utile à  d'autres. image/cliccool.gif' class='bbc_emoticon' alt=' :p ' />



Edit: après mise en production fructueuse de mon côté, je propose de passer le post en HQ.

Réponses

  • yoannyoann Membre
    19:39 modifié #2
    Pas mal ! J'aime bien l'idée, je garde ça dans un coin du disque !
  • NseaProtectorNseaProtector Membre
    19:39 modifié #3
    Oui, c'est pas con du tout! Surtout pour ceux qui comme moi ont un petit peu de mal avec instrument.
    MERCI Mala, tu vas sauver la galaxie avec ça ! lol
  • iSofTomiSofTom Membre
    19:39 modifié #4
    En effet ça a l'air vraiment utile, ça permet de ne pas perdre plein de temps à  la chasse aux variables non releasées...

    Je testerai dans mon prochain projet!

    Merci!  :p
  • AliGatorAliGator Membre, Modérateur
    19:39 modifié #5
    Sympa en effet, je testerai aussi.
    Seul problème, ça ne détecte les leaks potentiels qu'à  l'exécution et non à  la compilation... (bon je sais, on peut pas mieux faire c'est pas de ta faute :P et c'est déjà  super bien... c'est juste dommage que l'analyse statique (Clang) de Xcode 3.2 ne les détecte pas tous donc justement de ce côté ça peut vachement aider !)
  • MalaMala Membre, Modérateur
    19:39 modifié #6
    Heureux que cela vous plaise.

    dans 1260727601:

    c'est juste dommage que l'analyse statique (Clang) de Xcode 3.2 ne les détecte pas tous donc justement de ce côté ça peut vachement aider !)

    Oui c'est même surprenant. C'est une vraie passoire en ce qui concerne les variables d'instance.
  • ThibautThibaut Membre
    19:39 modifié #7
    Voici quelques modifications que tu devrais apporter pour rendre le tout compatible iPhone :

    NSObject+DeallocControl.h
    #import &lt;Foundation/Foundation.h&gt;<br />...<br />
    



    NSObject+DeallocControl.m
    ...<br /><br />while ( ![instance isKindOfClass:[self class]] &amp;&amp; instance)<br /><br />...<br /><br />NSLog(@&quot;Class &#092;&quot;%@&#092;&quot; - Instance variable &#092;&quot;%@&#092;&quot; != nil - Potential memory leak?&quot;,[instance class],iVarName,nil);<br /><br />...
    
Connectez-vous ou Inscrivez-vous pour répondre.