gestion de la mémoire

muqaddarmuqaddar Administrateur
22:43 modifié dans API AppKit #1
Salut,

Je suis en train de refaire un exercice dans le livre "cocoa par la pratique" (c'est incroyable tout ce qu'on commence à comprendre au bout de la deuxième fois qu'on lit les mêmes pages...).

D'ailleurs, ça y est, j'ai compris ce qu'étaient les accesseurs.  ;D

Voici 4 méthodes accesseurs :

<br />-(NSString *)personName<br />{<br />&nbsp; &nbsp; return personName;<br />}<br /><br />-(void)setPersonName:(NSString *)s<br />{<br />&nbsp; &nbsp; [s retain];<br />&nbsp; &nbsp; [personName release];<br />&nbsp; &nbsp; personName = s;<br />}<br /><br />-(float)expectedRaise <br />{<br />&nbsp; &nbsp; return expectedRaise;<br />}<br /><br />-(void)setExpectedRaise:(float)f<br />{<br />&nbsp; &nbsp; expectedRaise = f;<br />}<br />


Ce qui m'échappe, c'est au niveau de la libération de la mémoire. Ok pour le NSString :
    [s retain];
    [personName release];
    personName = s;

Mais pourquoi il est inutile de faire la même chose avec un float, genre :
    [f retain];
    [expectedRaise release]
    expectedRaise = f;

Après tout, float est un nombre, c'ets un type du C, pas un pointeur, mais il occupe bien de la mémoire non ?

Réponses

  • ClicCoolClicCool Membre
    juin 2004 modifié #2
    Ton float est une variable et non un objet.
    Oui ton float occupe une petite place en mémoire.
    La durée de vie des variables est déterminée par leur domaine de validité déterminé à l'écriture du code.
    Elles peuvent en effet être déclarées comme Globales et restent alors persistantes, ou être une variable d'instance comme ton expectedRaise et a la même durée de vie que l'instance.
    Dans ton cas le float est un paramètre de ta méthode. Il est purement local (par construction), c'est en fait une copie de la valeur transmise à ta méthode.
    Le float a une durée de vie limitée à ta méthode (il en est de même du reste pour ton pointeur "s" MAIS PAS pour l'objet qu'il pointe)
    Quand tu écrit:
    expectedRaise = f;<br />
    
    En fait c'est pas ton float f que tu garde, tu en copie la valeur dans expectedRaise, avant justement que ton f ne disparaisse en fin de méthode.
    C'est pas comme
    personName = s;
    
    où tu copie la valeur-pointeurs dans personName.
    La AUSSI le pointeur lui même t'as pas non plus à le détruire.[s retain] ne retient pas "s" mais l'Objet pointé et [personName release] ne libère pas "personName" mais l'Objet pointé par personName.

    C'est pour ça aussi que, pour le variable d'instance pointant sur des objets, quand tu libère l' Objet pointé [personName release] il faut immédiatement chaque fois copier dans le pointeur personName la valeur d'un pointeur sur un autre objet ou alors mettre le pointeur à zéro "personName=nil;" afin d'éviter d'utiliser un pointeur qui pointe encore vers un objet déalloué.

    [EDIT] En fait "s" et "f" sont toutes deux de simples variables locales (détruites en fin de méthode sans que tu n'ais à t'en occuper).
    Et "personName" et† "expectedRaise" sont toutes deux des variables d'instance.
    La seule différence c'est que "s" et "personName" pointent vers un objet que tu veux "retenir" ou "libérer".
  • muqaddarmuqaddar Administrateur
    22:43 modifié #3
    Merci ClicCool !

    C'est bien plus clair maintenant ! ;-)
  • muqaddarmuqaddar Administrateur
    22:43 modifié #4
    Ah, j'ai un plantage (sigbus - signal 10) juste au moment où je quitte l'appli, je pense que ça doit être un pb de libération mémoire. Vous me confirmez pour que je cherche l'erreur dans de domaine ? :-)
Connectez-vous ou Inscrivez-vous pour répondre.