Séquence des événements?
-
05-07-2019 - |
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 -
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