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?

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top