Fuite ou pas ?
fouf
Membre
Voila, j'ai un array d'objets PlotFormula, eux meme ayant la méthode -(BOOL)activated. Je souhaite avoir une méthode pour récupérer dans un nouvel array les objets PlotFormula qui ont le activated == YES. La voila, mais j'ai peur d'avoir créer une fuite mémoire.
Ya t'il vraiment une fuite ??
- (NSArray *)formulasToGraph<br />{<br /> NSMutableArray *array;<br /> NSEnumerator *e = [formulas objectEnumerator]; //formulas est l'array de depart<br /> PlotFormula *f;<br /> <br /> while(f=[e nextObject]){<br /> if([f activated]){<br /> [array addObject:f];<br /> }<br /> }<br /> return array;<br />}<br />
Ya t'il vraiment une fuite ??
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il manque l'allocation de array.
Pour le reste, je ne vois aucune fuite.
.
A vrai dire, j'ai un peu fait exprés. Mais en fait si je fait un alloc, il faut que je fasse à la fin un autorelease. J'ai tort ??
Mais il est plus propre en effet d'utiliser un array "autorelesable". Ainsi, si plus tard tu n'emploies plus ce tableau, il sera détruit.
.
Si je dis que je ne suis pas d'accord, ça ne va pas lancer un flameware ? Ce n'est pas par pur esprit de contradiction, c'est juste qu'il me semble que l'autorelease n'est semblable à un garbage collector que d'assez loin !
Le garbage collector cherche les fuites mémoires dans un graphe de dépendances entre objets. Et tu ne maà®trises absolument pas quand le "release" (finalize) sera fait en java. Du coup, tu n'as qu'une mauvaise maà®trise de la quantité de mémoire utilisée par un programme.
En Objective-C, tu planifies exactement quand un objet sera détruit. Si tu ne le release pas toi-même, ou ne l'inscrit pas au bassin d'autorelease, il ne sera jamais détruit ! Il n'y a pas de garbage collector tournant en tâche de fond pour trouver ce genre de fuite.
Par contre, quand un objet est marqué pour l'autorelease, tu sais exactement quand il va être releasé:
-si c'est toi qui as créé le NSAutoreleasePool, c'est quand tu releasera ce dernier
-si c'est le autoreleasepool "invisible" habituel, c'est au prochain runloop de l'interface.
Au passage : quand j'ai écrit "De C++ à Objective-C", je pensais que c'était une pratique plutôt rare, de créer soi-même des NSAutoreleasePool. Depuis, j'ai révisé mon opinion, car par exemple, dans MozoDojo, il y'a plein d'endroits où je le fais : autour de certaines portions de code que je sais générer beaucoup d'objets temporaires. Du coup, je m'assure qu'ils n'encombreront pas la mémoire au-delà du bloc que j'ai encadré. Et je fais ainsi de substentielles économies. (Et pour pas cher, car c'est vraiment hyper simple de créer un NSAutoreleasePool. À part alloc, init, et au final release, y'a rien à faire)!
+
Chacha