Frage

Weiter diese Frage Ich habe eine Reihe von Speicherlecks behoben Bencoding.m (ursprünglich aus hier)

Ich habe alle offensichtlichen Speicherlecks behoben, aber Clang hat vier "Lecks von zurückgegebenen Objekten" -Fehlern gefunden, von denen ich nicht sicher bin, wie ich sortieren soll:

Die vollständigen Nachrichten/geeigneten Code sind:

NSMutableData *data = [[NSMutableData alloc] init];

1] Methode gibt ein Objektiv-C-Objekt mit einer Anzahl von +1 zurück (Besitz von Referenz)

[...]
snprintf(buffer, 32, "%lu:", [object length]);
[data appendBytes:buffer length:strlen(buffer)];
[data appendData:object];
return data;

3] Objekt wurde als Besitzreferenz an Caller zurückgegeben (Einzelbehörde, die an Caller übertragen wurde)

War es hilfreich?

Lösung

OK, um die Antwort oben zu erweitern (danke, dass du mich auf den richtigen Weg gesetzt hast) ...

return [data autorelease]

Sie haben einige Objekte "Daten" zugewiesen und werden dieses Objekt an den Anrufer zurückgeben. Die Art und Weise, wie dies in OBJ-C funktioniert, ist, dass es in einer gewissen Ebene des Anrufstapels einen NSAutoreleAspool gibt. Wenn Sie die Nachricht "autorelease" an Daten senden, fügt sie diesen Autorelease -Pool hinzu. Auf diese Weise kann der Anrufer das "Daten" -Objekt kurz verwenden (dh über die Dauer des lokalen Stack -Rahmens), ohne "Release" explizit aufzurufen, und schließlich, wenn der Autorelease -Pool "Pops" überlastet wird, werden Daten ausgeführt (sofern nicht Jemand ruft "behalten"). Das ist ziemlich klug.

Süss. Ich glaube, ich habe gerade meinen grünen Gürtel in OBJ-C-Speichermanagement verdient.

Andere Tipps

Sie wollen:

Rückgabe [Datenautorelease];

Da übergeben Sie es dem Anrufer.

Es klingt so, als ob die Objekte vor ihrer Rückkehr nicht richtig automatisch veröffentlichen werden, was gegen die verstößt Objektiv-C-Speicherverwaltungskonventionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top