Setter et gestion de la mémoire

molgowmolgow Membre
22:49 modifié dans API AppKit #1
Hello,

Voilà  j'ai vraiment de la peine avec la gestion de la mémoire en Objective-C (pourquoi ne font-ils pas comme en Java ? :'( )

J'aimerais qu'on me dise si c'est bien juste de faire comme je fais dans l'exemple suivant :

@implementation Config<br /><br />- (id)init<br />{<br />&nbsp; &nbsp; self = [super init];<br />&nbsp; &nbsp; if (self) {<br />		title = [NSString string];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />- initWithCoder:(NSCoder *)coder<br />{<br />	title = [[coder decodeObject] retain];<br />	return self;<br />}<br /><br />- (void)encodeWithCoder:(NSCoder *)coder<br />{<br />	[coder encodeObject:title];<br />}<br /><br />- (void)dealloc<br />{<br />	[title release];<br />	[super dealloc];<br />}<br /><br />- (NSString*)getTitle<br />{<br />	return title;<br />}<br /><br />- (void)setTitle:(NSString*)theTitle<br />{<br />	[title release];<br />	title = theTitle;<br />	[title retain];<br />}<br /><br />@end


J'ai les méthodes relatives au coder parce que j'enregistre cette classe sur le disque (document-based application).

Merci pour l'aide !

Molgow

Réponses

  • mars 2005 modifié #2
    Pour le set, tu dois faire

    [tt][theTitle retain];
    [title release];
    title = theTitle;[/tt]

    Ton code plantera si tu remplaces le titre par lui même. Fais l'exercice avec les retain count, tu comprendras. Sinon, regarde là : http://www.projectomega.org/article.php?lg=fr&php=tuts_objc2&p=2

    [EDIT]Eddy, grilled
  • Eddy58Eddy58 Membre
    mars 2005 modifié #3
    Tout est correct, sauf ta méthode setTitle, qu'il faut remplacer par : :)
    [tt]
    - (void)setTitle:(NSString*)theTitle
    {
          [theTitle retain]; // Tout d'abord, faire un retain sur theTitle, car il peut être libéré ailleurs
          [title release]; // Libérer title
          title = theTitle; // Donner le pointeur de theTitle à  title
    }
    [/tt]

    [EDIT] Zut, grilled by Renaud. Je passe toujours trop de temps à  me relire :)
  • 22:49 modifié #4
    Autre erreur, dans le init. pour ton titre du dois faire [[NSString alloc] init]; et pas utiliser le constructeur +string, qui renvoie un objet placé dans l'autorelease pool, ce qui pour une variable d'instance peut faire planter le programme.
  • molgowmolgow Membre
    22:49 modifié #5
    Ok merci pour vos réponses !! (rapide en plus!!  )

    Pour l'initialisation de title, ne pourrais-je pas faire title = [[NSString string] retain]; aussi ? Bon c'est mieux c'est vrai de faire un simple alloc et init, mais est-ce que ça marcherait aussi ? (pour savoir si j'ai bien compris le principe)
  • 22:49 modifié #6
    Oui, c'est bon.
  • cbrandtcbrandt Membre
    22:49 modifié #7
    parfois je code les 'getter' comme ça:

    <br />(NSString*)getTitle<br />{<br />    return [[title retain] autorelease];<br />}<br />
    


    ça garantit au code appellant d'avoir l'objet dans autorelease pool au cas où il serait relâché par ailleurs...
  • mars 2005 modifié #8
    Je doute de la pertinence d'une telle méthode. Si cette variable est suffisamment importante pour un objet, c'est à  cet objet à  faire un retain dessus pour s'assurer de sa disponibilité. Sinon il s'agit d'une variable à  utiliser le temps d'une méthode, et là  le risque est nul.

    Bien que l'autorelease pool soit un mécanisme pratique, il ne faut pas en abuser non plus. La consommation mémoire et processeur est quand même plus importante quand on en fait usage.

    Par contre ce qui serait plus pertinent est de faire [tt]return [[title copy] autorelease];[/tt] afin de s'assurer que la variable ne puisse être modifiée ailleurs (mais ça n'est pas pertinent ici car la variable est immutable).
  • fouffouf Membre
    22:49 modifié #9
    Si on veut vraiment te chercher la ptit bête en Java, les getters sont de la forme getTitle, mais en Obj-C de la forme title. Mais, sinon, ce n'a aucune importance.

    Insomniac Renaud ? ou  :(renaud): ?  :o
  • amnesicamnesic Membre
    22:49 modifié #10
    dans 1110011242:

    Si on veut vraiment te chercher la ptit bête en Java, les getters sont de la forme getTitle, mais en Obj-C de la forme title. Mais, sinon, ce n'a aucune importance.


    Bonne remarque ! car si cela a quand même de l'importance de prendre de bonne habitude de respecter le KVC (Key Value Coding) en utilisant "title" au lieu de "getTitle" : Cela simplifie le codage ensuite pour rendre son appli scriptable, pour le binding ...etc..
Connectez-vous ou Inscrivez-vous pour répondre.