Question

J'essaie de comprendre ce qui se passe dans le getter ci-dessous, voici ce que j'ai compris jusqu'à présent:

(1) le getter renvoie un pointeur sur un objet NSString. (2) l'objet NSString est conservé, peut-être parce que nous venons de lui donner un pointeur. (3) autorelease? quand est-ce que cela s'active, quand l'instance PlanetClass est désallouée (libérée)?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

EDIT: Je pense que je suis plus confus quant à la raison de la retenue réelle et de la publication ultérieure. Je croyais comprendre que le getter renvoyait simplement un pointeur sur nil ou sur un objet qui existe déjà (c'est-à-dire qu'il a été défini par le poseur). Je pense que je comprends la retenue car nous donnons un pointeur et nous devons le suivre, mais qu'en est-il la version, est-ce juste une sécurité intrinsèque en cas d’oubli ultérieur de la libération de l’objet NSString?

La variable d’instance planetName est également publiée dans ma méthode dealloc (voir ci-dessous) autorelease semble faire de même, juste plus tard lorsque le pool sera vidé?

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

cheers -gary -

Était-ce utile?

La solution

Cela pourrait être une bonne idée de laisser Objective-C gérer cela comme une propriété, vous permettant de nettoyer une partie de l'implémentation afin de conserver la gestion de la mémoire, et bien, gérable:

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

Il existe beaucoup de docs disponible en ligne pour plus de détails sur Propriétés Objective-C et @synthèse .

Documents de gestion de la mémoire

Je recommande vivement cette lecture d'Apple en mémoire gestion pour essayer de comprendre en quoi consiste tout le contenu du conserver / version .

Autres conseils

Lorsque la libération automatique est envoyée à un objet, il est ajouté au pool de libération automatique. Lorsque le pool est vidé, il envoie une libération à tous les objets du pool. Ainsi, tout objet du pool autorelease sera libéré une fois le pool vidé.

Le retour / autorelease dans la méthode getter ne fait rien, vous pouvez simplement retourner nom_planete

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top