Mémoire et gestion des fuites….

Retourner au sommaire

Retain, new, copy, release et autres autoRelease…..

L’utilisation d’Objective-C pour la plateforme Iphone à comme particularité de ne pas posséder pour l’instant de ramasse-miette (garbage collector), et utilise un systeme de mémoire gérée. Par gérée, il faut entendre ici, que la gestion mémoire incombe entièrement au développeur.

Les attributions et libérations sont entièrement manuelles, et tout défaut de gestion entrainera indubitablement des plantage de l’application ou des fuites mémoires.

1 – Un système de compteur :

Au cours du développement, chaque objet se voit attribuer un compteur de références, qui permettra de contrôler les espaces mémoire.

Au cours de la vie de l’objet, le compteur se voit allouer une unité pour chaque référence, et une valeur est retranchée en fin de vie.

Par exemple, L’instanciation du type :

MonObjet *monObjet = [[MonObjet alloc] une méthode:unArgument]

ajoute 1 au compteur de l’object MonObject.

Plus tard, l’utilisation de [monObject release] retranche 1 au compteur. Ici le décompte sur l’objet étant maintenant de 0, l’espace mémoire attribué à l’objet est entièrement libéré, est devient disponible pour d’autres opérations. Tout nouvel appel sur l’objet, créera immanquablement un arrêt du programme [monObjet uneAutreMethode].

Par contre, tout oublis de release sur un objet, créera une fuite mémoire.

Il est donc indispensable de suivre ces règles de création et de destruction d’objet : Pour créer un objet, on lui alloue un espace mémoire avec la commande alloc, copy ou new. et tout objet qui vous appartient (c’est à dire que vous avez utilisé conjointement avec la commande alloc, new ou copy) devra être décompter avec la commande release.

2 – Utilisation de la commande retain et appropriation d’objet.

Dans le cas ou l’utilisation d’un objet sans les commandes alloc, new ou copy, la mémoire et gérer directement par l’objet, et ne doit pas être décompté avec la commande release.

Ceci peut être génant dans le cas d’utilisation ultérieur, alors que le decompte à été automatiquement fait par l’objet. L’objet n’est plus disponible.

exemple :


int unEntier = [NSNumber numberWithInt:100] ;// la référence est créee sans utiliser alloc, new ou copy;

Dans ce cas l’utilisation de la commande retain, permets d’indiquer à l’objet et à son système de gestion du décompte que l’on prend la main sur celui-ci.

L’objet devient donc persistant. Dans ce cas, il faudra soustraire chaque référence à l’aide de la commande release.


[unEntier release];

3 – la commande autorelease

L’objective-C possède une fonction de bassin d’autorelease qui permet de gérer de multiples référence et de les libérer automatiquement à partir de ce bassin.

Ceci est utile dans le cas de boucles de création, ou de gestion de plusieurs thread.

on applique donc la commande autorelease à l’objet pour le joindre à ce bassin.

Dans la cas du développement pour l’iPhone, il peut être utile dans le cas par exemple d’une boucle qui crée une multitudes d’objets.

Dans ce cas  ci on utilise la fonction autorelease, et les objets seront détruits avec la destruction de l’objet principal, ce qui peut être trop tardif.

Il faut donc créer son propre bassin, pour gérer la destruction optimisé des objets.

La création d’un bassin ou autorelease pool :


NSAutoreleasePool *monBassinAuto = [[NSAutoreleasePool alloc]  init];

Ensuite, tout les objets qui recevront la commande autorelease, seront liberés avec la commande :


[monBassinAuto drain]

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :