gestion mémoire
tablier
Membre
Je n'arrive pas à comprendre la différence entre les deux lignes ci-dessous:
A vot' bon coe“ur msieur dames.
J'ai l'impression que les résultats sont identiques puisque dans les deux cas, le string est dans l'autoRelease Pool et disparaitra à la fin de la boucle d'évènement. Mais probablement que je me plante et si c'est le cas pourquoi écrire l'un plus tôt que l'autre?1) return [[[NSString alloc] initWithString:machin] autoRelease] ;
2) return [NSString stringWithString:machin] ;
A vot' bon coe“ur msieur dames.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
NB : à savoir que NSString est un cas un peu particulier car fortement optimisé (et en plus c'est un "class cluster"), ce qui fait que ce n'est pas toujours le meilleur exemple à prendre pour essayer de comprendre les mécanismes internes. Par exemple [NSString stringWithString:@toto] est exactement aussi équivalent à @toto directement (et ça n'a donc aucun intérêt d'utiliser stringWithString), puisque les chaà®nes constantes sont compilées dans la partie des constantes du binaire, puisque pour les NSString on peut directement mettre des litéraux. (stringWithString n'a éventuellement de sens que pour être utilisé par les sous-classes, mais l'appeler sur la classe NSString ne sert à rien).
Merci pour c'est info!! C'est bon à savoir /wink.png' class='bbc_emoticon' alt=';)' />
Ce qui me donne parfois des soucis est de savoir quand un objet de l'autoRelease Pool va être libéré! Je trouve que ce n'est pas toujours évident. Si j'ai bien compris, l'objet est libéré en fin de boucle d'évènement si son "retain count" est à zéro. Vrai/Faux ?
C'est pas compliqué dans l'absolu, mais ce qui rend sans doute ça obscur c'est que tu ne crées pas explicitement la première NSAutoreleasePool de haut niveau, associée à la RunLoop principale de ton programme, et que tu ne sais pas forcément ce qu'est une RunLoop
En fait, partons sur un exemple de code, où on crée nous-même explicitement une NSAutoreleasePool : Ici les 3 objets qu'on a créés, entre la création de notre NSAutoreleasePool en première ligne et sa destruction en dernière ligne, ne vont pas être libérés dès la réception du message "autorelease" (comme ça serait le cas si on leur avait envoyé "release" au lieu d'autorelease). Au lieu de ça, ces objets vont être mis dans la dernière NSAutoreleasePool qu'on a créée, donc dans notre cas celle qu'on a appelé "arp". Et c'est seulement quand l'AutoreleasePool arp va être détruite qu'elle va en profiter pour envoyer le vrai message "release" à tous les objets qu'elle avait enregistrés (à tous les objets qui avaient reçus un message autorelease précédemment).
Donc pour répondre à la question "quand est-ce qu'un objet autorelease est effectivement releasé" bah c'est quand l'autoreleasepool est détruite. Ou quand elle est vidée (drain).
Maintenant il se trouve que si tu regardes dans ton main.m, Xcode en créant ton projet t'a aussi créé une NSAutoreleasePool dans le main avant d'appeler UIApplicationMain(). Donc si tu ne crées pas de NSAutoreleasePool explicitement comme on a fait dans l'exemple ci-dessous, les objets qui recoivent "autorelease" vont se mettre dans cette NSAutoreleasePool. Et ils seront vidés à chaque itération de la RunLoop.
Bon je vais relire un peu de doc.