2010-08-27 9 views
10

Ich habe ein Problem mit UIWebViews, ich habe die gleiche Frage hier, aber es gab keine hilfreiche Antwort. Die Frage ist hier: UIWebView memory management. Ich zitiere es:uiwebview und riesigen Speicherverlust

Ich entwickle eine Anwendung, die UIWebView stark nutzt. Diese App erzeugt beim Laden von Inhalten von meinem Server dynamisch viele UIWebViews. Einige dieser UIWebViews sind ziemlich groß und haben viele Bilder.

Wenn ich Instrumente verwende, um Lecks zu erkennen, kann ich keine erkennen. Allerdings sind viele Objekte zugeordnet und ich vermute, dass dies mit den UIWebViews zu tun hat.

Wenn die Webviews freigegeben werden, weil sie nicht mehr benötigt werden, scheint nicht der gesamte Speicher freigegeben zu sein. Ich meine, nach einer Anfrage an meinen Server erstellt die App eine UITableView und viele Webviews (Instrumente sagen etwa 8 MB). Wenn Benutzer zurück tippen, werden alle freigegeben, aber die Speicherauslastung verringert sich nur um 2-3 MB, und nach 5-10 Minuten stürzt die App ab.

Ich habe einfache Test-App erstellt und habe die gleichen Ergebnisse.

Es ist eine Tableview, Ich schaffe Details wie folgt aus:

DetailsVC *detailViewController = [[DetailsVC alloc] initWithNibName:@"DetailsVC" bundle:nil]; 
detailViewController.n = indexPath.row; 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 

in DetailsVC ich eine webView in IB erstellt haben. Ich lade html wie folgt aus:

NSString *urlAddress; 
if (self.n == 0) 
{ 
    urlAddress = @"http://www.google.com"; 
} 
else 
{ 
    urlAddress = @"http://www.yahoo.com"; 
} 

NSURL *url = [NSURL URLWithString:urlAddress]; 

NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

[self.webView loadRequest:requestObj]; 

ich auch:

- (void)viewDidUnload { 
self.webView = nil; 
} 

Das ist es, jedes Mal wenn ich jede webView wählen in RootViewController ich 2-3 MB Speicher bin zu verlieren, Gibt es eine Lösung zu diesem Problem?

Danke.

+0

es scheint wie sehr alt und gut bekanntes Problem, Leute laufen in es seit 2008 und immer noch keine Lösung ((((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, Ich habe eine Idee gefunden, wie man dieses Problem umgehen kann, es wird hier beschrieben: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html 't keine Lösung für ein Problem, aber eine Art von Hack. Ich kann nicht glauben, dass es die einzige Möglichkeit ist, es zu tun, andere Gedanken? Danke – Burjua

+0

mögliche Duplikate von [Ist UIWebView Leckspeicher?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

Antwort

0

Ich denke, seit Sie Webview = Nil setzen, verlieren Sie jede Chance, es zu veröffentlichen.

+0

Ich habe es versucht und ohne es, es spielt eigentlich keine Rolle, es wird veröffentlicht, aber nicht nur ein Teil des Speichers wird freigegeben – Burjua

+1

Das Setzen einer Retain-Eigenschaft auf Null gibt auch den vorherigen Wert frei. –

3

einfach überprüfen Sie die folgenden 1. Ist u die Webansicht als Eigentum machen es 2. entfernen und den folgenden Code in didFinishLaunchingWithOptions in Appdelegate

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
    [sharedCache release]; 

Ich denke, dann ur Problem

gelöst
+0

Ok, danke, ich werde es versuchen – Burjua

+1

Nein, das hilft leider nicht: (( – Burjua

0

Ich weiß, dass dieser Thread ein bisschen alt ist, aber nur für eine Idee und um ein paar weitere relevante Bits hinzuzufügen, würde ich gerne diese Tipps hinzufügen, damit die zukünftigen Besucher sich das auch ansehen können und dort ein Problem gelöst werden könnte.

  • Sie sollten set Cache policy zu Ihrem NSURLRequest Objekt und für die Politik prüfen, die Cache-Daten ignorieren finden Sie in der documentation.

  • Da Sie einen Anruf an release in Ihrem Code haben, nehme ich an, dass Sie ARC verwenden, also warum rufen Sie nicht [super dealloc] in viewDidUnload()?

  • Werfen Sie einen Blick auf diesen Thread für cleanForDealloc mit UIWebView.

  • Ist es ein UITableViewController? mit benutzerdefinierten Zellen? Versuchen Sie, die Zuordnung ebenfalls aufzuheben (releaseFromSuperView, auf null setzen).

Hoffe es hilft!