Pergunta

Eu estou tentando entender o que está acontecendo no getter abaixo, isso é o que eu entendo até agora:

(1) o getter retorna um apontador para um objecto NSString. (2) o objeto NSString é mantido, possivelmente porque temos apenas dado afastado um ponteiro para ele. (3) de disparo automático? quando faz isso ativar, quando a instância PlanetClass é desalocada (liberado)?

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

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

EDIT: Acho que estou mais confuso sobre a razão para o real reter e depois solte. meu entendimento era que o getter simplesmente retornou um ponteiro para nada ou um objeto que já existe (ou seja, foi definido pelo setter) Eu acho que entendo a reter como estamos dando um ponteiro e precisamos controlar isso, mas o que dizer o lançamento, é que apenas um mecanismo de proteção Incase I depois se esqueça de liberar o objeto NSString?

O planetName variável de instância também é liberar no meu método dealloc (veja abaixo) autorelease parece estar fazendo o mesmo, apenas mais tarde, quando a piscina é drenada?

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

aplausos -Gary -

Foi útil?

Solução

Pode ser uma boa idéia para deixar Objective-C lidar com isso como uma propriedade, permitindo-lhe limpar algumas das implementações para manter o gerenciamento de memória, bem, gerenciável:

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

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

abundância de docs disponível on-line para obter mais detalhes sobre Propriedades objectivo-C e @synthesize.

Memória Gestão de Documentos

Eu recomendo esta leitura da Apple na memória gestão para tentar ajudar a entender o que todo o burburinho retain / release está em causa.

Outras dicas

Quando disparo automático é enviado para um objeto, ele é adicionado ao pool de disparo automático. Quando a piscina é drenada, ele envia a libertação para todos os objetos na piscina. Assim, qualquer objeto na piscina disparo automático será comunicado quando a piscina é drenada

O retorno / autorelease no método getter não está fazendo nada, você pode simplesmente voltar planetName

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top