IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Devenir un Xcoder

Un livre gratuit pour commencer avec Cocoa à l'aide d'Objective-C
Image non disponible


précédentsommairesuivant

XVIII. Gestion de la mémoire

XVIII-A. Introduction

Dans plus d'un chapitre je me suis excusé de ne pas expliquer deux ou trois déclarations dans les exemples. Ces déclarations traitent avec la mémoire. Votre programme n'est pas le seul programme sur votre Mac, et la RAM est une denrée précieuse. Donc, si votre programme n'a plus besoin d'une portion de mémoire, vous devez la restituer au système. Quand votre mère vous disait que vous deviez être poli et vivre en harmonie avec la communauté, elle vous enseignait comment programmer ! Même si votre programme était le seul à tourner, la mémoire non libérée finira par dépeindre votre programme dans un coin et votre ordinateur traînera la patte.

XVIII-B. Garbage Collection

Les techniques de gestion de mémoire utilisées par Cocoa et présentées plus loin dans ce chapitre sont communément connues sous le nom de Comptage de référence (Reference Counting). Vous trouverez des explications complètes sur ce système de gestion de la mémoire de Cocoa dans des livres ou des articles plus spécialisés (voir chapitre 15).

Mac OS X 10.5 (Léopard) introduit une nouvelle forme de la gestion de mémoire pour Objective-C 2.0, connu sous le nom de Cocoa Garbage Collection (nettoyage de mémoire). Garbage Collection gère automatiquement la mémoire, supprimant la nécessité d'expliciter les objets Cocoa retain, release ou autorelease.

La magie de Garbage Collection fonctionne sur tous les objets Cocoa qui héritent de NSObject ou NSProxy, et permet à un programmeur d'écrire simplement moins de code que dans les versions antérieures d'Objective-C. Il n'y a pas grand-chose de plus à dire à son sujet, en pratique. Oubliez tout ce que vous avez appris dans ce chapitre !

XVIII-C. Activer Garbage collection

Garbage Collection a besoin d'être activé, car il est désactivé par défaut dans un nouveau projet Xcode. Pour l'activer, sélectionnez votre application Cible (Target) dans la liste Source, et ouvrez l'Inspecteur. Mettez une coche à côté de l'item "Enable Objective-C Garbage Collection". Notez que tous les frameworks (ensemble de bibliothèques, d'outils et de conventions permettant le développement d'applications) que vous reliez à votre projet doivent également être "Garbage collectés".

XVIII-D. Comptage de référence : le cycle de vie de l'objet

Si vous êtes intéressé par les techniques de gestion de la mémoire pré-Leopard, lisez ce qui suit.

Lorsque votre programme crée un objet, l'objet occupe de l'espace en mémoire et vous devez libérer cet espace lorsque votre objet n'est plus utilisé. C'est-à-dire que si votre objet n'est plus utilisé, vous devez le détruire. Toutefois, déterminer quand un objet a fini d'être utilisé peut ne pas être facile à faire.

Par exemple, durant l'exécution du programme, votre objet peut être référencé par de nombreux autres objets, et ne doit donc pas être détruit tant qu'il y a une possibilité qu'il puisse être utilisé par d'autres objets (essayer d'utiliser un objet qui a été détruit peut amener votre programme à planter ou à se comporter de façon imprévisible).

XVIII-E. Le compte de retenue (retain count)

Afin de vous aider à détruire les objets quand ils ne sont plus nécessaires, Cocoa associe un compteur à chaque objet, qui représente ce qui est appelé le "compte de retenue" de l'objet. Dans votre programme, lorsque vous stockez une référence à un objet, vous devez en informer l'objet en augmentant son compte de retenue de un. Lorsque vous supprimez une référence à un objet, vous en informez l'objet en diminuant son compte de retenue de un. Lorsque le compte de retenue d'un objet devient égal à zéro, l'objet sait qu'il n'est plus référencé nulle part et qu'il peut être détruit sans danger. L'objet se détruit alors lui-même, libérant la mémoire associée.

Par exemple, supposons que votre application est un juke-box numérique et que vous avez des objets représentant des chansons et des listes de lecture. Supposons qu'un objet chanson donné est référencé par trois objets listes de lecture. S'il n'est pas référencé ailleurs, votre objet chanson aura un compte de retenue de trois.

Liste de lecture 1, Liste de lecture 2, Liste de lecture 3

Une chanson

Compte de retenue = 3
Image non disponible

XVIII-F. Maintenir et libérer (retain and release)

Pour augmenter le compte de retenue d'un objet, il vous suffit d'envoyer à l'objet un message retain.

 
Sélectionnez
[unObjet retain];

Pour diminuer le compte de retenue d'un objet, il vous suffit d'envoyer à l'objet un message release.

 
Sélectionnez
[unObjet release];

XVIII-G. Autorelease

Cocoa offre également un mécanisme appelé "autorelease pool" qui vous permet d'envoyer à retardement un message release à un objet ; pas immédiatement, mais plus tard. Pour l'utiliser, il vous suffit d'enregistrer l'objet avec ce qu'on appelle un autorelease pool, en envoyant un message autorelease à votre objet.

 
Sélectionnez
[unObjet autorelease];

L'autorelease pool s'occupera de l'envoi à retardement du message release à votre objet. Les déclarations traitant les autorelease pool que nous avons vu précédemment dans nos programmes sont des instructions que nous donnons au système afin de configurer correctement la machinerie autorelease pool.


précédentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Alex Clarke et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.