Pregunta

Estoy tratando de entender lo que está sucediendo en el getter a continuación, esto es lo que entiendo hasta ahora:

(1) el getter devuelve un puntero a un objeto NSString. (2) el objeto NSString se conserva, posiblemente porque acabamos de entregarle un puntero. (3) autorelease? ¿cuándo se activa eso, cuando se desasigna (lanza) la instancia de PlanetClass?

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

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

EDITAR: Creo que estoy más confundido con respecto al motivo de la retención real y la versión posterior. mi entendimiento fue que el captador simplemente devolvió un puntero a cero o a un objeto que ya existe (es decir, fue establecido por el configurador) Creo que entiendo la retención ya que estamos regalando un puntero y necesitamos rastrear eso, pero ¿qué hay de eso? el lanzamiento, ¿es solo un caso a prueba de fallos que luego olvido liberar el objeto NSString?

La variable de instancia planetName también se publica en mi método de dealloc (ver más abajo) ¿Parece que el autorelease está haciendo lo mismo, justo después cuando se agota el grupo?

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

saludos -gary-

¿Fue útil?

Solución

Podría ser una buena idea dejar que Objective-C maneje esto como una propiedad, permitiéndole limpiar parte de la implementación para mantener la administración de la memoria, bueno, manejable:

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

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

Hay mucho de docs disponible online para obtener más detalles sobre Propiedades de Objective-C y @synthesize .

Documentos de gestión de memoria

Recomiendo altamente esta lectura de Apple en la memoria administración para intentar y ayudar a comprender de qué se trata todo el keep / release hubbub.

Otros consejos

Cuando el autorelease se envía a un objeto, se agrega al conjunto de autorelease. Cuando la agrupación se agota, envía la liberación a todos los objetos de la agrupación. Por lo tanto, cualquier objeto en el grupo de autorelease se liberará cuando se drene el grupo

El retorno / autorelease en el método getter no está haciendo nada, solo puedes devolver planetName

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top