Setter et gestion de la mémoire
molgow
Membre
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 :
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
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 /> self = [super init];<br /> if (self) {<br /> title = [NSString string];<br /> }<br /> 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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[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
[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
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)
ça garantit au code appellant d'avoir l'objet dans autorelease pool au cas où il serait relâché par ailleurs...
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).
Insomniac Renaud ? ou :(renaud): ?
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..