Mam problem z UIWebView. Używam tego komponentu do ładowania normalnych stron internetowych na iPadzie / iPhonie. UIWebView jest prezentowany w modalViewController. Niektóre strony są bardzo głodne pamięci, a niektóre mają również zawartość Flash.
Problem polega na tym, że czasami na niektórych stronach pojawia się ostrzeżenie o pamięci
Received memory warning. Level=1
Kiedy tak się dzieje i kiedy zamykam ten modalViewController (który ma stronę załadowaną do webView), wówczas poprzedni widok ładuje się automatycznie - metoda viewDidLoad zostaje ponownie uruchomiona.
Podejrzewam, że niektóre strony w UIWebView zużywają dużo pamięci i pamięci aplikacji zwalniają jej widoki, ale nie ulega awarii.
Czy istnieje sposób na ograniczenie zużycia pamięci przez webView lub czy istnieje inny sposób uniknięcia tego ostrzeżenia o pamięci?
Dzięki!
Odpowiedzi:
3 dla odpowiedzi № 1Masz bardzo małą kontrolę nad wykorzystaniem pamięci UIWebView
przedmioty Masz również bardzo niewielką kontrolę nad ogólnym wykorzystaniem pamięci systemowej. Dlatego nie ma sposobu na uniknięcie ostrzeżeń pamięci. iOS oczekuje, że Twoje aplikacje będą działały poprawnie po otrzymaniu ostrzeżeń o pamięci, więc Twój viewDidLoad
należy napisać metodę obsługi ponownego uruchamiania po ostrzeżeniu pamięci.
Jedyne, co możesz zrobić, aby ograniczyć użycie pamięci UIWebView
polega na wyświetlaniu prostych stron internetowych. Wygląda na to, że z twojego pytania to nie jest opcja.
Edytować: viewDidUnload
jest wywoływany w warunkach niskiej pamięci. Oczekuje się, że ta metoda zwolni wszystko, co jest łatwe do odtworzenia w metodzie viewDidLoad. Nie zwalniaj informacji o stanie, które chcesz pokazać użytkownikowi, gdy widok ten powróci na ekran. Potem w twoim viewDidLoad
Metoda sprawdza wszystkie obiekty, które tworzysz. Jeśli są nil
, muszą zostać zainicjalizowane, w przeciwnym razie nie będzie to pierwszy raz viewDidLoad
została wywołana metoda i nie powinieneś ponownie inicjalizować obiektów.
Innymi słowy: viewDidUnload
obsługuje sytuacje o małej ilości pamięci i viewDidLoad
nie powinien zakładać, że został uruchomiony raz.