2009-08-08 12 views
5

Speicherleck Problem mit - NSConcreteDataSpeicherleck Problem NSData in iPhone

// to set tip - photo in photo frame  
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:pathOfThumbNail]]; 
UIImage *cellThumbImg; 
if([data length]>0){ cellThumbImg=[UIImage imageWithData:data];} else { cellThumbImg=[UIImage imageNamed:@"130X90.gif"]; } 
UIImageView *imgView=[[UIImageView alloc]initWithImage:cellThumbImg]; imgView.frame=photoFrame; 
(cellThumbImg.size.height>=58 || cellThumbImg.size.width>=58) ? [imgView setContentMode:UIViewContentModeScaleToFill] : [imgView setContentMode:UIViewContentModeCenter] ; 
[cell.contentView addSubview:imgView]; 
[imgView release]; 

meine Frage ist sehr ähnlich zu dieser Frage

iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView

Auch, ich habe folgenden Code hinzugefügt, um meine Die Anwendung wurde fertig gestartet, siehe unten. Der folgende Code dient zum Festlegen von sharedCache-Speicher mit Kapazität null. Es wird fast das NSConcreteData-Leck in meiner Anwendung entfernen. Aber Speicherlecks.

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 
[window makeKeyAndVisible]; 
} 

ich konnte keine Lösung für diese Art von Frage von Stapelüberlauf finden.

Wenn Sie antworten können, werde ich Ihnen dankbar sein.

Vielen Dank im Voraus.

+0

Ich habe den Weg als @Bkaenk & @epatelsaid gefolgt. Allerdings gibt es das gleiche Problem, wie folgende Frage hat. http://stackoverflow.com/questions/280053/iphone-memory-leak-nsdata-datawithcontentsofurl-uiwebview –

Antwort

7

Ich hatte auch in meinem Large-Projekt Probleme damit. Nachdem er mit einem Apple-Techniker zusammengearbeitet hatte, um die Lecks ausfindig zu machen, fragte er schließlich das Apple-Entwicklerteam hinter NSURLConnection. Sie sagten im Grunde, dass es einen internen Cache gibt, der überhaupt nicht in NSURLConnection löschbar ist, und es war ein bekanntes Problem.

Also machte ich mich auf die Suche nach Alternativen. Ich habe ASIHTTPConnection (Link unten) gefunden, das von CFNetwork funktioniert. Es wurde entwickelt, um ein Drop-In-Ersatz für NSURLConnection, plus eine Reihe von anderen tollen Extras wie Download auf die Festplatte anstelle von Speicher, Download-Fortsetzen, Fortschrittsbalkenrückrufe etc.

Ich habe es in allen meinen Projekten verwendet und hatte nie irgendwelche Probleme oder Beschwerden. Als Antwort auf deine Frage habe ich diese Speicherlecks beseitigt.

http://allseeing-i.com/ASIHTTPRequest/

+1

Während dies die akzeptierte Antwort ist und wahrscheinlich das OP-Problem gelöst hat, habe ich die einfachere Lösung in epatels Antwort übersehen. Seine Antwort sollte die akzeptierte sein. – coneybeare

4

Ihre Freigabenachricht wird falsch geschrieben, Sie gaben relaese ein, aber es ist release. Ich denke, das ist nur ein Problem in dem Code, den Sie für diese Frage eingegeben haben.

Sekunde. Sie benötigen nicht die erste alloc init Kettenmeldung. Alles was Sie brauchen ist:

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

Zugegeben, ich weiß nicht, ob dieser Anruf tatsächlich richtig ist, aber ich weiß, dass es eine automatische Freigabe kehrt auslaufen würde NSData Objekt Ihrer bisherigen alloc init Bedeutung.

+0

@Blaenk - Sir, überprüfen Sie bitte die Korrektur in meiner Frage. Ich habe das gleiche Problem. Auch nach dem Anwenden Ihrer vorgeschlagenen Logik finde ich das gleiche Speicherverlustproblem. –

10

Sie drei Linien haben, lässt sie

1. NSData *imageData = [[NSData alloc] init]; 
2. imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 
3. [imageData release]; 

Linie 1 nach unten brechen: zuweisen und init einen neuen NSData. Diese NSData haben eine Referenzzählung von +1

Zeile 2: Daten aus dem Internet abrufen und in eine NSData einfügen. Dies setzt die Variable verwendet Linie 1 auf die neue NSData die NSData (die Autorelease gesetzt) ​​versteckt alloced und inited auf der Linie 1

Zeile 3: wird die NSData Release auf Leitung 2 empfangen

Sie entfernen können Zeile 1 und 3 und fügen Sie einfach die Variablendeklaration zu Zeile 2. Da es Autoreleased wird es später von der Ereignisschleife lösen sein wird ...

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

ich schlage vor, Sie lesen die Memory Management Abschnitte here

+0

@ePatel - Sir, Bitte überprüfen Sie die Korrektur in meiner Frage. Ich habe das gleiche Problem. Auch nach dem Anwenden Ihrer vorgeschlagenen Logik finde ich das gleiche Speicherverlustproblem. –

+0

Nit: Zeile 2 blendet die gerade zugewiesenen/initialisierten imageData aus und erstellt eine neue. –

+0

Ich bin anscheinend ein Idiot, tut mir leid. Ich habe das in Ihren Kommentaren gesucht, aber verpasst und eine schlechte Annahme basierend auf der editierten Frage gemacht ... –

7

Jedes Mal, wenn wir dataWithContentOfURL verwenden wir haben es zu umschließen mit NSAutoReleasePool, wie folgt aus:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// ** Your Operations ** 

NSData *data = [NSData dataWithContentsOfURL:someURL]; 

// ** Your Operation ** 

[data autorelease]; 
[pool release]; 

Dieses auch für NSURLRequest und NSURLConnection gilt.

Das Problem ist mit dem Compiler selbst und das oben genannte ist die einzige Methode, um das Problem zu lösen.

+1

Das ist die Antwort. Groß. –

+0

Das ist absolut falsch. Sie haben das Objekt nicht mit 'retain',' alloc', 'copy',' mutableCopy' oder 'new' behalten. Sie haben kein Recht auf "Autorelease". Dies ist nicht korrekt und führt dazu, dass Ihr Programm irgendwann fehlschlägt. – user102008