Pregunta

Con el código siguiendo las marcas del analizador de la llamada selector de setMyDict como una fuga potencial y en dealloc dice "decremento incorrecta de la cuenta de referencia no es propiedad en este punto por el que llama"

- (id)init {
  if (self = [super init]) {
      [self setMyDict:[[NSMutableDictionary alloc] init]];
  }
  return self;
}

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

@synthesize myDict = _myDict;

No entiendo esto. Pensé, que con el alloc init del objeto aumenta la cuenta de retención por uno y el puntero se almacena en _myDict través de la propiedad sintetizado. Si utilizo este código en lugar

- (id)init {
  if (self = [super init]) {
    _myDict = [[NSMutableDictionary alloc] init];
  }
  return self;
}

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

Analizador no se queja. ¿Qué me falta?

¿Fue útil?

Solución

El @synthesize le proporciona un setter y getter para el objeto que se está sintetizando.

Un método setter miradas algo como esto (tomado de la documentación de Apple)

-(void)setMyDict:(NSMutableDictionary *)newDict {
    if (myDict != newDict) {
       [myDict release];
       myDict = [newDict retain];
    }
}

Se está creando una fuga cuando lo hace:

[self setMyDict:[[NSMutableDictionary alloc] init]];

Debido a que nunca suelta el diccionario recién alloc'd.

Una forma de evitar esto es:

NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[self setMyDict:dict];
[dict release];

Este se encarga de la fuga.

En el método dealloc, se debe utilizar:

[myDict release]; // Or whatever your property is called.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top