web-dev-qa-db-fra.com

Quand UIViewController viewDidUnload est-il appelé?

Remarque: cette question est obsolète —viewDidUnload est obsolète iOS 6.

Quand le viewDidUnload de UIViewController est-il automatiquement appelé? Oui je sais, quand la vue se décharge. Mais quand cela se produit-il automatiquement? Comment puis-je le faire manuellement? Merci.

45
mk12

Si vous émettez un avertissement de mémoire dans le simulateur (regardez dans le menu), cela sera appelé pour tout contrôleur de vue attaché à une vue qui n'est pas visible.

C'est parce que les contrôleurs de vue par défaut sont enregistrés pour les notifications d'avertissement de mémoire, et toute vue qui n'est pas actuellement utilisée sera déchargée par le contrôleur de vue - la méthode viewDidUnload est là pour que vous puissiez nettoyer tout ce que vous voulez, pour économiser plus la mémoire (ou si vous avez conservé des IBOutlets pour libérer de la mémoire qui serait autrement libérée par la vue en cours de déchargement).

Généralement, tous les IBOutlets que vous publiez dans dealloc doivent également être libérés (et les références définies sur zéro) dans cette méthode.

En plus d'émettre manuellement un avertissement de mémoire dans le simulateur, vous pouvez en émettre un par programmation avec

- (void)_simulateLowMemoryWarning {
  // Send out MemoryWarningNotification
  [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification
                                                      object:[UIApplication sharedApplication]];
  // Manually call applicationDidReceiveMemoryWarning
  [[[UIApplication sharedApplication] delegate] applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];
}

Vous pouvez ensuite faire en sorte que cela se produise toutes les 5 secondes à l'aide d'une minuterie

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
johnboiles

-viewDidUnload est appelé chaque fois que la propriété view du viewcontroller est définie sur nil, manuellement ou le plus souvent via didReceiveMemoryWarning:.

17
Rob Napier

iOS 6.x et versions ultérieures

Je sais que c'est une question plus ancienne, mais je pense qu'une réponse devrait être soumise concernant les modifications de l'API viewDidUnload dans iOS 6, à savoir que dans iOS 6 viewDidUnload n'est plus appelé (du tout) et a été déprécié.

10
Beltalowda

viewDidUnload appelé dans des conditions de mémoire faible. Nous devons décharger les éléments que nous avons chargés dans la méthode viewDidLoad. Nous devons renoncer à la propriété de l'objet en appelant la méthode accesseur pour le définir sur nil. En cas de sortie, l'objet se libère de sorte que la référence de l'objet peut être définie en toute sécurité sur zéro. S'il ne s'agit pas d'une propriété synthétisée, nous devons d'abord libérer l'objet que nous avons défini sur zéro.

3
Vipin_iOSdev