Kiedy jest wywoływany UIViewController viewDidUnload?

Uwaga: to pytanie jest nieaktualne-viewDidUnload jest przestarzały iOS 6.

Kiedy automatycznie wywoływany jest viewDidUnload UIViewController? Tak, Wiem, kiedy Widok się rozładuje. Ale kiedy to się dzieje automatycznie? Jak mogę to zrobić ręcznie? Dzięki.

Author: mk12, 2009-08-17

5 answers

Jeśli wystawisz ostrzeżenie o pamięci w symulatorze (zajrzyj do menu), zostanie ono wywołane dla dowolnego kontrolera widoku dołączonego do widoku, który nie jest widoczny.

Dzieje się tak dlatego, że kontrolery widoków domyślnie są rejestrowane dla powiadomień ostrzegawczych o pamięci, a każdy widok, który nie jest obecnie używany, zostanie rozładowany przez kontroler widoku - istnieje metoda viewDidUnload, dzięki której możesz wyczyścić wszystko, co chcesz, aby zaoszczędzić dodatkową pamięć (lub jeśli zachowałeś niektóre IBOutlets aby zwolnić pamięć, która w przeciwnym razie byłaby zwolniona przez rozładowanie widoku).

Ogólnie wszelkie Iboutlety, które wypuścisz w dealloc, powinny być również zwolnione (i odniesienia ustawione na nil) w tej metodzie.

 42
Author: Kendall Helmstetter Gelner,
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
2009-08-17 02:29:00

Oprócz ręcznego wyświetlania ostrzeżenia o pamięci w symulatorze, można wydać JEDEN program za pomocą

- (void)_simulateLowMemoryWarning {
  // Send out MemoryWarningNotification
  [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification
                                                      object:[UIApplication sharedApplication]];
  // Manually call applicationDidReceiveMemoryWarning
  [[[UIApplication sharedApplication] delegate] applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];
}
Możesz wtedy spowodować to co 5 sekund za pomocą timera
static NSTimer *gLowMemoryTimer = nil;

- (void)stopLowMemoryTimer {
  [gLowMemoryTimer invalidate];
  gLowMemoryTimer = nil;
}

- (void)startLowMemoryTimer {
  if (gLowMemoryTimer) {
    [self _stopLowMemoryTimer];
  }
  gLowMemoryTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(_simulateLowMemoryWarning) userInfo:nil repeats:YES];
}
 37
Author: johnboiles,
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-06-17 00:09:13

-viewDidUnload jest wywoływana za każdym razem, gdy właściwość view viewcontroller jest ustawiona na nil, ręcznie lub najczęściej przez didReceiveMemoryWarning:.

 17
Author: Rob Napier,
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
2009-08-17 03:14:05

IOS 6.x i Później

Wiem, że to starsze pytanie, ale uważam, że należy odpowiedzieć na pytania dotyczące zmian w API viewDidUnload W iOS 6, a mianowicie, że w iOS 6 viewDidUnload nie jest już wywoływany (w ogóle) i został przestarzały.

 10
Author: Thuggish Nuggets,
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
2015-12-10 19:20:59

Viewdidunload wywołany w warunkach niskiej pamięci. Powinniśmy rozładować rzeczy, które załadowaliśmy w metodzie viewDidLoad. Musimy zrzec się własności obiektu przez wywołanie metody accessor, aby ustawić go na nil. W przypadku wyjścia, obiekt zwalnia się, więc odniesienie do obiektu może być bezpiecznie ustawione na nil. Jeśli nie jest to zsyntetyzowana właściwość, to najpierw musimy zwolnić obiekt niż ustawiliśmy na nil.

 3
Author: Vipin_iOSdev,
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
2012-01-24 10:01:47