2010-07-26 3 views
9

Je mets NSLog(@"%@::%@", [[self class] description], NSStringFromSelector(_cmd)); à la fois dans viewDidLoad et viewDidUnload d'un contrôleur de vue.Pourquoi viewDidUnload est-il appelé moins souvent que viewDidLoad?

Dans le journal, j'ai trouvé que viewDidLoad est beaucoup plus que viewDidUnload lorsque l'application se déplace vers et depuis différents .nibs.

Pourquoi?

+0

Je me demande simplement si ma réponse est acceptée, j'aurai +50 repu, non? Pourquoi n'ai-je pas reçu ça? – vodkhang

+0

@vodkhang, ma faute. Je n'avais pas réalisé que je devais cliquer sur Accepter et l'icône '+ 50'. – ohho

Répondre

17

viewDidLoad et viewDidUnload ne correspondent pas l'un à l'autre.

Le viewDidUnload ne sera appelé que si vous recevez un avertissement de mémoire. Le système appelle alors automatiquement viewDidUnload.

Dans le cas normal, lorsque vous appuyez sur un MyViewController et le faites ressortir. Le cycle de vie va se présente comme suit:

init 

viewDidLoad 

release 

Cela signifie que, chaque fois que vous INIT et push/présenter une vue, une viewDidLoad sera appelée. Mais lorsque vous affichez la vue, la version sera appelée dans un cas normal et viewDidUnload sera appelée dans le cas d'avertissement de la mémoire.

Ceci est assez implicite et Apple ne l'indique pas clairement sur le Guide. Voici une référence: Load and Unload cycle

+0

Alors, quelle est la différence entre viewDidUnload et didRecieveMemoryWarning? –

+0

Tout d'abord, l'application reçoit un avertissement de mémoire insuffisante du système. Ensuite, chaque contrôleur de vue appelle sa méthode didReceiveMemoryWarning. Ensuite, si le contrôleur de vue libère sa vue, il appelle sa méthode viewDidUnload. Vous pouvez remplacer cette méthode pour effectuer tout nettoyage supplémentaire requis pour vos vues et votre hiérarchie. – vodkhang

+0

Regardez à nouveau le lien des cycles Charger et Décharger – vodkhang

1

J'imagine que dans les cas où -viewDidUnload n'a pas été appelé, le contrôleur de vue a été libéré.

  1. viewDidLoad: charge du contrôleur voir
  2. viewDidUnload: avertissement mémoire, contrôleur décharge vue
  3. viewDidLoad: charge de contrôleur voir à nouveau
  4. -: le contrôleur est libéré, ne pas décharger explicitement la vue

Vous et en haut avec 2 appels -viewDidLoad et 1 appel `-viewDidUnload '.

Peut-être aussi mettre un NSLog dans la méthode -dealloc et voir si le nombre de -dealloc et -viewDidUnload appels correspond au nombre de combinés -viewDidLoad appels.

0

Lors du chargement d'une nouvelle vue, l'ancienne vue peut toujours être chargée en arrière-plan. vous cherchez viewWillAppear comme conterpart je pense. Les vues ne sont déchargées que dans le cas d'un avertissement de mémoire.

Questions connexes