0 votes

Objective c - gestion de la mémoire

Disons que j'ai une classe

@interface Foo : NSObject  
{  
  NSString *a;  
  NSDate *b;  
}  
Foo *temp;  

ma question est : lorsque j'utilise [temp retain] est-ce que le compteur des membres est également retenu? disons que j'ai une référence de la classe depuis une méthode et que je veux retenir la classe, est-ce que je dois retenir chaque membre?

2voto

KennyTM Points 232647

Quand j'utilise [temp retain], le compteur des membres est-il également conservé?

Non.

Disons que j'ai obtenu la référence de la classe à partir d'une méthode et que je veux conserver la classe, ai-je besoin de conserver chaque membre?

Non.

La durée de vie des membres doit être gérée par la classe Foo elle-même, pas par l'utilisateur de la classe Foo. Si vous pouvez/devez changer le nombre de retention des membres, la classe n'est pas correctement encapsulée.

0voto

Jeff Kelley Points 12893

Non, appeler [temp retain] ne retiendra pas a et b. Le schéma typique que vous verrez est que a et b sont conservés dans la méthode -init de la classe et libérés dans la méthode -dealloc, ce qui les maintient tant que l'objet est en vie. Par exemple :

@implementation Foo

- ( id)initWithA:( NSString * )aString andB:( NSString * )bString
{
    if ( self = [ super init ]) {
        a = [ aString copyWithZone:[ self zone ]];
        b = [ bString copyWithZone:[ self zone ]];
    }

    return self;
}

- ( void )dealloc
{
    [ a release ];
    [ b release ];

    [ super dealloc ];
}

@end

Dans cet exemple, a et b sont automatiquement conservés en raison de l'appel à -copyWithZone:. Vous n'avez pas besoin de les retenir vous-même.

0voto

Frank C. Points 2630

Eimantas,

Vous pourriez le supposer si vous utilisez la collecte des ordures. Comme vous n'avez pas spécifié une application iPhone, je suppose que vous parlez d'une application OS X et la question reste alors de savoir si vous développez pour Leopard ou ultérieur?

Frank

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