Do czego służy -(void)viewDidUnload
?
Czy nie mógłbym po prostu zwolnić wszystkiego -dealloc
? Gdyby widok się rozładował, i tak nie zostałby -dealloc
wywołany?
Do czego służy -(void)viewDidUnload
?
Czy nie mógłbym po prostu zwolnić wszystkiego -dealloc
? Gdyby widok się rozładował, i tak nie zostałby -dealloc
wywołany?
Oprócz tego, co już zostało wskazane, chciałem bardziej szczegółowo omówić logikę stojącą za -viewDidUnload
.
Jednym z najważniejszych powodów, dla których warto ją wdrożyć, jest to, że UIViewController
podklasy zwykle zawierają również odniesienia do różnych podwidoków w hierarchii widoków. Te właściwości mogły zostać ustawione IBOutlets
podczas ładowania z końcówki lub -loadView
na przykład programowo wewnątrz .
Dodatkowa własność widoków podrzędnych polega na tym UIViewController
, że nawet jeśli jego widok zostanie usunięty z hierarchii widoków i zwolniony w celu oszczędzania pamięci, przez który podglądy podrzędne są również zwalniane przez widok, w rzeczywistości nie zostaną one cofnięte, ponieważ UIViewController
sam nadal zawiera własne zaległe zachowując również odniesienia do tych obiektów. Zwolnienie UIViewController
dodatkowej własności tych obiektów gwarantuje, że zostaną one również zwolnione w celu zwolnienia pamięci.
Obiekty, które tutaj zwalniasz, są zwykle odtwarzane i ustawiane ponownie, gdy UIViewController
widok pochodzi re-loaded
ze stalówki lub za pomocą implementacji -loadView
.
Należy również pamiętać, że UIViewController
view
właściwość jest nil
w momencie wywołania tej metody.
Jak mówi dokumentacja :
W tej samej sytuacji
dealloc
się nie nazywa. Ta metoda jest dostępna tylko w systemie OS3 i nowszych. Radzenie sobie z tą samą sytuacją w iPhone OS 2.x było prawdziwym bólem!Aktualizacja z lipca 2015 r . : należy zauważyć, że
viewDidUnload
w systemie iOS 6 została wycofana, ponieważ „Widoki nie są już czyszczone w warunkach małej ilości pamięci, więc ta metoda nigdy nie jest wywoływana”. Tak więc, współczesna rada nie polega na tym, aby się tym martwić i używaćdealloc
.źródło
Dzieje się tak, ponieważ zazwyczaj ustawiasz
@property
as"(nonatomic, retain)"
i jako taki ustawiacz, który jest tworzony dla ciebie, zwalnia bieżący obiekt, a następnie zachowuje argument, tj.... robi coś w rodzaju:
Dlatego zabijasz dwa ptaki jednym kamieniem: zarządzanie pamięcią (zwalnianie istniejącego obiektu) i przypisywanie wskaźnika do zera (ponieważ wysłanie jakiejkolwiek wiadomości do wskaźnika zerowego zwróci zero).
Mam nadzieję, że to pomoże.
źródło
Pamiętaj, że
viewDidUnload
jest to metoda w kontrolerze widoku, a nie w widoku. Metoda widokudealloc
zostanie wywołana, gdy widok zostanie zwolniony, ale metoda kontrolera widokudealloc
może zostać wywołana dopiero później.Jeśli pojawi się ostrzeżenie o małej ilości pamięci, a widok nie jest wyświetlany, co stanie się na przykład za każdym razem, gdy użyjesz UIImagePickerController, aby umożliwić użytkownikowi zrobienie zdjęcia, widok zostanie wyładowany i będzie musiał zostać ponownie załadowany.
źródło
Wniosek:
Kontrolery widoku mają właściwość widoku. Zazwyczaj końcówka lub fragment kodu dodaje inne widoki do tego widoku. Dzieje się tak często wewnątrz metody -viewDidLoad, na przykład:
ponadto plik nib może utworzyć przycisk i dołączyć go do widoku kontrolera widoku.
W systemie iPhone OS 2.2, kiedy -didReceiveMemoryWarning został wywołany z systemu, trzeba było zwolnić coś, aby zwolnić pamięć. Możesz zwolnić widok całego kontrolera widoku, jeśli to ma sens. Lub po prostu duża zawartość zajmująca pamięć.
Teraz w nowym OS 3.0 jest metoda -viewDidUnload, która zostanie wywołana z systemu, gdy widok zostanie wyładowany z powodu małej ilości pamięci (proszę mnie poprawić: kiedy dokładnie to się wywoła?)
-viewDidUnload służy do zwalniania wszystkich obiektów, których właścicielem był zarówno sam kontroler widoku, jak i widok. Powód: jeśli kontroler widoku przechowuje odwołania do elementów podrzędnych widoku, tj. Przycisku, przywoływane widoki potomne nie zostaną zwolnione, ponieważ ich liczba zachowań wynosi> = 1. Po ich zwolnieniu w -viewDidUnload można je zwolnić z pamięci.
źródło
Przestarzały widok Apple ViewWillUnload, teraz powinieneś użyć didReceiveMemoryWarning lub dealloc, aby zwolnić swoje objetcs.
źródło
Jeśli kontroler widoku zostanie pobrany ze stosu kontrolera nawigacji i nie zostanie zachowany nigdzie indziej, zostanie cofnięty, a dealloc zostanie wywołana zamiast viewDidUnload. Powinieneś zwolnić widoki utworzone w loadView w dealloc, ale nie jest konieczne ustawianie zmiennych na nil, ponieważ wkrótce po wywołaniu dealloc zmienne już nie będą istnieć.
źródło
Możesz zwolnić wszystkie podziały, które trzymasz, na przykład ten UIImageView, który zachowałeś w metodzie loadView, lub jeszcze lepiej obraz, który był w tym UIImageView.
źródło