Co dokładnie muszę zrobić w viewDidUnload?

Mam tendencję do wypuszczania moich rzeczy w-dealloc, a teraz iPhone OS 3.0 wprowadził metodę funny-viewDidUnload, gdzie mówią:

// zwolnij wszystkie zachowane podviews widok główny. // np. self.myOutlet = nil;

Tak-viewDidUnload wydaje się być wywoływany, gdy widok kontrolera widoku został wyrzucony z pamięci. A jeśli mam podglądy dołączone do głównego widoku kontrolera widoku, muszę zwolnić te rzeczy tylko tutaj, ale nie w -dealloc jako więc?

To jest mylące. Ponadto, co jeśli-dealloc powoduje, że Widok zostanie rozładowany (zwolniony)? Z drugiej strony, wywoła -viewDidUnload?

Zdaję sobie sprawę z różnicy, że-viewDidUnload jest tylko w przypadku, gdy sam widok zostaje zabity, ale kontroler widoku pozostaje w pamięci. I-dealloc jest dla przypadku, gdy cała sprawa idzie do śmieci.

Może ktoś wyjaśni zamieszanie.

Author: dontWatchMyProfile, 2010-02-14

3 answers

Celem tutaj jest "zrównoważenie" zarządzania subview. Wszystko, co tworzysz w viewDidLoad powinno zostać wydane w viewDidUnload. Ułatwia to śledzenie tego, co powinno zostać wydane, gdzie. W większości przypadków twoja metoda dealloc jest lustrzanym odbiciem Twojej metody init, a twoja viewDidUnload będzie lustrzanym odbiciem Twojej metody viewDidLoad.

Jak zauważyłeś, viewDid... metody są używane, gdy widok jest załadowany i rozładowany. Pozwala to na użycie wzorca, w którym widok kontroler pozostaje załadowany w pamięci, ale sam widok może być załadowany i rozładowany zgodnie z wymaganiami:

init
viewDidLoad
viewDidUnload
viewDidLoad
viewDidUnload
...
dealloc

Oczywiście nie zaszkodzi również zwolnić rzeczy w swojej metodzie dealloc, o ile ustawisz je na nil, gdy zwolnisz je w viewDidUnload.

Poniższy cytat z sekcji Zarządzanie pamięcią Apple UIViewController dokumentacja , opisuje ją bardziej szczegółowo:

[[12]} ... W iPhone OS 3.0 i nowszych, metoda viewDidUnload może być bardziej odpowiednie miejsce dla większości potrzeb.

Gdy pojawia się ostrzeżenie o niskiej pamięci, Klasa UIViewController oczyszcza swoje widoki, jeśli wie, że może je ponownie załadować lub odtworzyć później. Jeśli tak się stanie, wywoła również metodę viewDidUnload, aby dać kodowi szansę na zrzeczenie się własności obiektów powiązanych z hierarchią widoków, w tym obiektów załadowanych za pomocą pliku nib, obiektów utworzonych w metodzie viewDidLoad oraz obiektów utworzonych leniwie w czasie wykonywania i dodanych do hierarchii widoków. zobacz hierarchię. Zazwyczaj, jeśli kontroler widoku zawiera gniazda (Właściwości lub zmienne surowe zawierające słowo kluczowe IBOutlet), należy użyć metody viewDidUnload, aby zrzec się własności tych gniazd lub innych danych związanych z widokiem, które nie są już potrzebne.

 37
Author: e.James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 17:37:15

Jak mówisz viewDidUnload będzie wywoływany jeśli self.view = nil, zwykle występuje, gdy pojawia się ostrzeżenie o pamięci. W tej metodzie musisz zwolnić dowolny subview głównego widoku, który może być łatwo utworzony przez .xib lub loadView method. Powinieneś zwolnić dowolny obiekt danych, jeśli utworzysz go w viewDidLoad lub loadView itd. Ponieważ Metody te zostaną wywołane ponownie, aby przedstawić widok użytkownikowi, dane te mogą być łatwo odtworzone.

 3
Author: EEE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 17:31:47

Gdy pojawi się ostrzeżenie o pamięci, Zwykle viewcontroller rozładuje widok, ale sam nie będzie dealloc.
Wszystko, co można łatwo odtworzyć, powinno zostać rozładowane, ale nie Model widoku.

 0
Author: CiNN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 17:32:20