45 votes

Quand le UIViewController viewDidUnload est-il appelé ?

Note : Cette question est périmée- viewDidUnload est déprécié dans iOS 6.

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

42voto

Si vous émettez un avertissement de mémoire dans le simulateur (regardez dans le menu), ceci 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 sont par défaut 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 voudriez, pour économiser de la mémoire supplémentaire (ou si vous avez conservé quelques IBOutlets pour aider à libérer la mémoire qui serait autrement libérée par la vue étant déchargée).

En général, tous les IBOutlets que vous libérez dans dealloc doivent également être libérés (et les références mises à zéro) dans cette méthode.

37voto

johnboiles Points 1482

En plus d'émettre manuellement un avertissement de mémoire dans le simulateur, vous pouvez en émettre un de manière programmatique 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 en utilisant 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];
}

17voto

Rob Napier Points 92148

-viewDidUnload est appelé chaque fois que la propriété view du viewcontroller est mise à nil, soit manuellement, soit le plus souvent par l'intermédiaire de didReceiveMemoryWarning: .

10voto

Thuggish Nuggets Points 1337

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

3voto

Vipin_iOSdev Points 62

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 accessor pour le mettre à nil. Dans le cas d'une sortie, l'objet se libère lui-même afin que la référence de l'objet puisse être mise à nil en toute sécurité. S'il ne s'agit pas d'une propriété synthétisée, nous devons d'abord libérer l'objet avant de lui attribuer la valeur nil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X