segni Analyzer una perdita potenziale di questo costrutto
-
25-09-2019 - |
Domanda
Con questo codice i segni analizzatore la chiamata di selezione setMyDict come un potenziale perdita e in dealloc afferma "decremento non corretto del conteggio di riferimento non è di proprietà, a questo punto da parte del chiamante"
- (id)init {
if (self = [super init]) {
[self setMyDict:[[NSMutableDictionary alloc] init]];
}
return self;
}
- (void)dealloc {
[[self myDict] release];
[super dealloc];
}
@synthesize myDict = _myDict;
Non capisco questo. Ho pensato, che con l'alloc init dell'oggetto incrementa il conteggio di conservare per uno e il puntatore viene memorizzato nella _myDict tramite la proprietà sintetizzato. Se io uso questo codice al posto
- (id)init {
if (self = [super init]) {
_myDict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)dealloc {
[_myDict release];
[super dealloc];
}
Analyzer non si lamenta. Che cosa mi manca?
Soluzione
Il @synthesize fornisce un setter e getter per l'oggetto voi sono di sintesi.
Un metodo setter simile a questa (preso dalla documentazione di Apple)
-(void)setMyDict:(NSMutableDictionary *)newDict {
if (myDict != newDict) {
[myDict release];
myDict = [newDict retain];
}
}
si sta creando una perdita quando fate:
[self setMyDict:[[NSMutableDictionary alloc] init]];
Perché non hai mai rilascia il dizionario di recente alloc'd.
Un modo per ovviare a questo è:
NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[self setMyDict:dict];
[dict release];
Questo si prende cura della fuga di notizie.
Nel metodo dealloc, è necessario utilizzare:
[myDict release]; // Or whatever your property is called.