Frage

Mit dem folgenden code analyzer markiert die setMyDict selector Ruf als potenzielle Leck und in dealloc heißt es "Falsche Dekrementieren der Referenzzähler nicht gehört werden, an dieser Stelle der Anrufer"

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

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

@synthesize myDict = _myDict;

Ich verstehe das nicht.Ich dachte, dass mit der alloc init den Objektes erhöht die retain-Zählung um eins, und der Zeiger gespeichert ist, in _myDict durch die synthetische Eigenschaft.Wenn ich diesen code verwenden, anstatt

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

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

Analyzer nicht beschweren.Was vermisse ich?

War es hilfreich?

Lösung

Die @synthetisieren, bietet Sie mit einem setter und getter für das Objekt, das Sie sind, synthetisiert.

Eine setter-Methode sieht ungefähr so aus (aus dem Apple-docs)

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

Erstellen Sie ein Leck, wenn Sie:

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

Denn Sie lösen Sie nie die neu alloc würde Wörterbuch.

Ein Weg, dies zu umgehen ist:

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

Diese kümmert sich um das Leck.

In der dealloc-Methode hinzu, die Sie verwenden sollten:

[myDict release]; // Or whatever your property is called.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top