Getter seqüência de eventos?
-
05-07-2019 - |
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 -
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
Há 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