8 votes

Est-il nécessaire de libérer la mémoire des propriétés d'Objective-c 2.0 ?

Cela fait un moment que je m'interroge sur les propriétés. Lorsque vous utilisez des propriétés, devez-vous surcharger le message de libération pour vous assurer que les propriétés sont des propriétés libérées ?

es decir l'exemple suivant (fictif) est-il suffisant ?

@interface MyList : NSObject {
NSString* operation;
NSString* link;
}
@property (retain) NSString* operation;
@property (retain) NSString* link;
@end

@implementation MyList
@synthesize operation,link;
@end

13voto

Philippe Leybaert Points 62715

Vous devez toujours libérer les variables d'accompagnement dans dealloc :

- (void) dealloc {
   [operation release];
   [link release];

   [super dealloc];
}

D'une autre manière :

- (void) dealloc {
   self.operation = nil;
   self.link = nil;

   [super dealloc];
}

Ce n'est pas la meilleure façon de libérer les objets, mais au cas où vous utiliseriez variables de soutien synthétisées C'est la seule façon de procéder.

REMARQUE : pour comprendre pourquoi cela fonctionne, examinons l'implémentation synthétisée du setter de enlace et ce qui se passe lorsqu'elle est fixée à néant :

- (void) setLink:(MyClass *) value {
   [value retain]; // calls [nil retain], which does nothing
   [link release]; // releases the backing variable (ivar)
   link = value;   // sets the backing variable (ivar) to nil
}

L'effet net est donc de libérer l'ivoire.

3voto

cocoafan Points 2766

En non CG des applications, oui. Il est habituel d'assigner nil au lieu de libérer les ivars. Ma meilleure expérience est de libérer les ivars initialisés avec init et d'assigner nil aux propriétés avec retain et copy mode.

Dans votre cas, j'assignerais nil

- (void) dealloc {
   self.operation = nil;
   self.link = nil;
   [super dealloc];
}

2voto

Ivan Points 198

La meilleure façon de procéder est la suivante :

- (void)dealloc {
    [operation release], operation = nil;
    [link release], link = nil;

    [super dealloc];
}

Il serait en effet plus pratique d'utiliser les méthodes setter générées

self.operation = nil;

mais c'est mal vu. On ne sait pas toujours sur quel thread un objet est désalloué. L'utilisation d'un accesseur peut donc poser des problèmes en déclenchant des notifications KVO.

Le problème est qu'il faut adapter le dealloc à la politique de gestion des objets définie dans la @property. Par exemple, ne libérez pas un iVar qui soutient une propriété (assign).

1voto

Kevin Ballard Points 88866

Non, vous remplacez l'option -dealloc méthode. Et oui, si vous ne libérez pas vos propriétés (ou plutôt, les ivars de soutien), vous aurez des fuites. Ainsi, dans votre @implémentation, vous devriez avoir quelque chose comme

- (void)dealloc {
    [operation release];
    [link release];
    [super dealloc];
}

1voto

Tom Dalling Points 10656

La synthèse d'une propriété ne crée que des méthodes getter et setter, et ne libère donc pas l'ivar lorsque l'objet est désalloué. Vous devez libérer l'ivar vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X