marcas Analizador una fuga potencial de esta construcción
-
25-09-2019 - |
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?
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.