2010-08-27 10 views
10

Mam problem z używaniem UIWebViews, widziałem to samo pytanie tutaj, ale nie było pomocne odpowiedzi. pytanie jest tutaj: UIWebView memory management. Zacytuję:Uiwebview i ogromna utrata pamięci

Pracuję nad aplikacją, która intensywnie korzysta z interfejsu UIWebView. Ta aplikacja generuje dynamicznie wiele UIWebView podczas ładowania zawartości z mojego serwera. Niektóre z tych widoków UIWeb są dość duże i mają wiele zdjęć.

Jeśli używam przyrządów do wykrywania wycieków, nie wykrywam żadnych. Jednak wiele obiektów jest przydzielanych i podejrzewam, że ma to związek z UIWebView.

Po opublikowaniu wyświetleń stron, ponieważ nie są już potrzebne, wydaje się, że nie cała pamięć została zwolniona Mam na myśli to, że po zgłoszeniu się do mojego serwera aplikacja tworzy UITableView i wiele odsłon (instrumenty mówią o 8Mb). Gdy użytkownik kliknie wstecz, wszystkie zostaną zwolnione, ale zużycie pamięci zmniejszy się tylko o 2-3 Mb, a po 5-10 minutach korzystania z aplikacji zawiesi się.

Stworzyłem prostą aplikację testową i mam takie same wyniki.

To tableview, tworzę DetailsView tak:

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

w DetailsVC Mam Webview utworzony w IB. Załadować html tak:

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]; 

ja również zrobić:

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

To jest to, za każdym razem mogę wybrać dowolną Webview w RootViewController jestem tracąc 2-3 MB pamięci, Czy istnieje rozwiązanie do tego problemu?

Dzięki.

+0

Wydaje się, że jest to bardzo stary i znany problem, ludzie mają do niego dostęp od 2008 roku i nadal nie ma rozwiązania ((((http://discussions.info.apple.com/thread.jspa?threadID=1729697 – Burjua

+0

Ok, Znalazłem jeden pomysł, jak obejść ten problem, opisany tutaj: http: //www.iphonedevsdk.com/forum/iphone-sdk-development/34840-uiwebview-memory-crash-caching-memory-useage.html. nie jest rozwiązaniem problemu, ale jakimś hakiem Nie mogę uwierzyć, że jest to jedyny sposób, aby to zrobić, inne myśli? Dzięki – Burjua

+0

możliwy duplikat [Czy wycieka pamięć UIWebView?] (http: // stackoverflow.com/questions/648396/does-uiwebview-leak-memory) –

Odpowiedz

0

Domyślam się, że ponieważ ustawiłeś webview = zero, tracisz szansę na zwolnienie.

+0

Próbowałem z nim i bez niego, to faktycznie nie ma znaczenia, jest zwolniony, ale ale nie tylko część pamięci zostanie zwolniona. – Burjua

+1

Ustawienie właściwości retain na zero również zwalnia poprzednią wartość. –

3

Wystarczy sprawdzić następujące 1. Czy u uczynić WebView jako własność wyjąć 2. i umieścić następujący kod w didFinishLaunchingWithOptions w Appdelegate

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

myślę wtedy ur problem jest rozwiązany

+0

Ok, dzięki, spróbuję to – Burjua

+1

Nie, niestety to nie pomoże: (( – Burjua

0

Wiem, że ten wątek jest trochę stary, ale tylko dla pomysłu i dodania kilku bardziej istotnych bitów chciałbym dodać te wskazówki, aby przyszli użytkownicy mogli się temu przyjrzeć i tam problem mógł zostać rozwiązany.

  • Powinieneś set Cache policy do obiektu NSURLRequest i sprawdzić, czy polityki, które ignorują dane pamięci podręcznej, zobacz documentation.

  • Ponieważ masz wywołanie release w kodzie i zakładam, że używasz ARC, więc dlaczego nie wywołujesz [super dealloc] w viewDidUnload()?

  • Zobacz ten wątek, aby dowiedzieć się, jak używać cleanForDealloc przy użyciu interfejsu UIWebView.

  • Czy to kontroler UITableViewController? z niestandardowymi komórkami? Spróbuj również zwolnić je (zwolnić, usunąćFromSuperView, ustawić na zero).

Mam nadzieję, że pomoże!

Powiązane problemy