Analisador marca um vazamento potencial para este construto
-
25-09-2019 - |
Pergunta
Com o código a seguir, o analisador marca a chamada seletor do Setmydict como um vazamento potencial e, no Dealloc, afirma que "decremento incorreto da contagem de referência não é de propriedade deste ponto pelo chamador"
- (id)init {
if (self = [super init]) {
[self setMyDict:[[NSMutableDictionary alloc] init]];
}
return self;
}
- (void)dealloc {
[[self myDict] release];
[super dealloc];
}
@synthesize myDict = _myDict;
Eu não entendo isso. Eu pensei que, com o aloc init, o objeto aumenta a contagem de retenção por um e o ponteiro é armazenado em _dict através da propriedade sintetizada. Se eu usar este código em vez disso
- (id)init {
if (self = [super init]) {
_myDict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)dealloc {
[_myDict release];
[super dealloc];
}
Analisador não reclama. o que estou perdendo?
Solução
O @synthesize fornece um setter e getter para o objeto que você está sintetizando.
Um método de setter se parece com isso (retirado do Apple Docs)
-(void)setMyDict:(NSMutableDictionary *)newDict {
if (myDict != newDict) {
[myDict release];
myDict = [newDict retain];
}
}
Você está criando um vazamento quando faz:
[self setMyDict:[[NSMutableDictionary alloc] init]];
Porque você nunca libera o recém -alocado dicionário.
Uma maneira de contornar isso é:
NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[self setMyDict:dict];
[dict release];
Isso cuida do vazamento.
No método Dealloc, você deve usar:
[myDict release]; // Or whatever your property is called.