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?

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top