2011-01-11 19 views
0

Ich habe ein NSMutableDictionary namens "output" und ich bin ein NSString hinzufügen, die eine ganze Zahl ist. Was ist der richtige Weg, dies zu tun? Ich kann es nicht herausfinden. Alles, was ich versucht habe, endet mit Speicherlecks.Speicherverwaltung - Objective C NSString

Dies ist, was ich derzeit haben:

val ist ein int

country ein NSString ist

Hier ist, wie ich "output" erklären:

NSMutableDictionary *output = [[[NSMutableDictionary alloc] init] autorelease]; 

Hier ist die Code, der ein Speicherleck verursacht:

NSString *temp = [NSString stringWithFormat:@"%d",val]; 
[output setValue:temp forKey:countryName]; 

folgende Ursachen auch ein Leck:

NSString *temp = [[NSString alloc] initWithFormat:@"%i",val]; 
[output setValue:temp forKey:source]; 
[temp release]; 
+2

Was Sie geschrieben hat, sieht gut aus. Warum denken Sie, dass Sie Speicherlecks haben und welche Objekte glauben Sie, dass Sie leckt? – Jonah

+0

Nur aus Neugier, warum benutzen Sie% d anstelle von% i? –

+0

Ich lief die Anwendung in Instruments und es zeigte, dass ich ein 100% Speicherleck in dieser Zeile hatte. – CodeGuy

Antwort

0

Versuchen zu drucken Variable TEMP ähnliche

NSLog("number = %d", [temp intValue]);

zu überprüfen, ob die Variable TEMP die Integer-Variable oder nicht, speichert.

Sie können auch den Code, den Sie verwendet haben, um das NSMutableDictionary zu deklarieren, möglicherweise können wir eine Art von Deklaration Problem dort finden.

+0

Hier ist die Deklaration von "Ausgabe": \t NSMutableDictionary * Ausgabe = [[[[[NSMutableDictionary Alloc] Init] Autorelease]; – CodeGuy

+0

und hier ist der Code, der einen 100% Speicherverlust erhält: \t \t \t NSString * temp = [NSString stringWithFormat: @ "% d", val]; \t \t \t [Ausgabe setValue: temp forKey: SchlüsselwortName]; – CodeGuy

+0

Sie können es auch automatisch freigeben, bevor Sie das Objekt in objective zurückgeben - c – Robin

2

Instrumente weist Sie auf die Quelle der Erschaffung des ausgelaufenen Objekts hin. Ihr Code-Snippet ist in Ordnung. Dies bedeutet, dass Sie später auf den Wert von output (oder temp selbst) zugreifen und von dieser Site überlagern.

+0

Ich gebe "Ausgabe" zurück, aber was meinen Sie mit dieser Site? – CodeGuy

+0

bedeutet dies, dass (das häufigste Beispiel) Sie auf den Schlüssel zugreifen: 'countryName' aus dem Ergebnis der Funktion/Methode (aka' output', die Sie zurückgeben). Der Codeabschnitt, der auf den Wert für countryName zugreift, führt dann zu einer Unausgeglichenheit in der Referenzzählung durch Nachrichtenübermittlung "beibehalten", wo er nicht beibehalten werden muss. – justin

0

Sie müssen eine Kopie des Werts erstellen und dann setValue in ein veränderbares Wörterbuch zurückgeben. Dann lass es los.

NSMutableDictionary *copyOfItem = [item copy]; 
[tmpMarkers addObject: copyOfItem]; 
[copyOfItem release], copyOfItem = nil;