Petite question sur la mémoire

muqaddarmuqaddar Administrateur
04:23 modifié dans API AppKit #1
Oup là  boom,

Une petite question avant d'aller dormir.

Dans une méthode de sauvegarde  -void(), j'ai :

<br />   NSMutableArray *paysSaveArray = [NSMutableArray array];<br />   NSEnumerator *enumerator = [paysArray objectEnumerator];<br />  NSDictionary* dict;<br />       while (dict = [enumerator nextObject]) {<br />          NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];<br />         [paysSaveArray addObject: tempDict];<br />      }<br /> [paysSaveArray writeToFile: paysPrefsFile atomically:YES];


ça marche très bien. Maintenant , paysSaveArray est construit en autorelease, mais ça s'autorelease quand ? Là , mon tableau est construit dans une boucle en plus. Je me demande tjs s'il vaut pas mieux faire :

NSMutableArray *paysSaveArray = [[NSMutableArray array] retain];


puis le release :

[paysSaveArray release];


Ce qui est plus sûr non ?
Je suis pas toujours sûr quand il faut faire ou pas un retain, bien que j'ai lu le tut de Renaud sur la mémoire chez PO.

Réponses

  • Eddy58Eddy58 Membre
    novembre 2004 modifié #2
    Tu utilises un constructeur de commodité qui effectivement met ton objet en autorelease, et un objet en autorelease est détruit peu après la fin de l'exécution de la méthode.
    Si c'est le mode de fonctionnement que tu cherches, alors tant mieux. ;)
    Le retain est nécessaire si tu a encore besoin de ton objet plus tard, mais là  je pense que tu ne te sers plus de ton objet une fois la sauvegarde effectuée.
    Si tu as encore besoin de ton objet, j'utiliserais plutot la méthode initWithCapacity plutot qu'un constructeur, pour éviter de s'emmêler les pinceaux et gérer plus logiquement ton retain count. :)

    <br />NSMutableArray *paysSaveArray=[[[NSMutableArray alloc] initWithCapacity:0] retain];<br />
    
  • muqaddarmuqaddar Administrateur
    04:23 modifié #3
    dans 1100738663:

    Tu utilises un constructeur de commodité qui effectivement met ton objet en autorelease, et un objet en autorelease est détruit peu après la fin de l'exécution de la méthode.


    Ah, bein, en gros c'est ça que je voulais savoir. Je n'en ai pas besoin ailleurs.
    Avec initWithCapacity, à  quoi correspond 0 ?
  • 04:23 modifié #4
    dans 1100762205:


    Ah, bein, en gros c'est ça que je voulais savoir. Je n'en ai pas besoin ailleurs.
    Avec initWithCapacity, à  quoi correspond 0 ?


    initWithCapacity est interessant si tu veux réserver en l'avance de la mémoire. Dans le cas où tu mets 0, cela revient au même que de faire un init simple.
Connectez-vous ou Inscrivez-vous pour répondre.