60 votes

iOS6 viewDidUnload Deprecated

Peut-être que c'est une mauvaise pratique, mais à partir de la documentation que j'ai lu, j'ai reçu les conseils d'initialiser les objets, dans certains cas, à l'intérieur de la méthode viewDidLoad et de néant dans viewDidUnload.

Par exemple, si vous avez quelque chose comme l'ajout d'un Observateur

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(filterready:)
                                                 name:@"filterReady"
                                               object:nil];

Maintenant, je n'ai pas de méthode pour supprimer l'Observateur, cependant le viewDidLoad est appelé à chaque fois que la vue est affichée, que les résultats en avoir plusieurs observateurs à courir après un certain temps et que le sélecteur est alors appelée plusieurs fois.

Je peux résoudre ce problème en déplaçant certains produits de nettoyage dans le viewDidDisappear méthode, mais maintenant j'ai quelques doutes si je fais la bonne chose.

Dans mon exemple j'ai plusieurs manettes de Navigation que sont le contrôle de leurs subnavigations, mais le dealloc n'est jamais appelée pour eux, même si elles ne sont pas référencées

107voto

Alex Points 636

Vous devez utiliser le - (void)didReceiveMemoryWarning et - (void)dealloc méthodes.

Dans iOS 6, le viewWillUnload et viewDidUnload méthodes de UIViewController sont désormais obsolète. Si vous utilisez ces méthodes pour libérer des données, utilisez la didReceiveMemoryWarning méthode à la place. Vous pouvez également utiliser cette méthode pour libérer les références à la vue du contrôleur de la vue, si elle n'est pas utilisée. Vous auriez besoin de test de la vue n'est pas dans une fenêtre avant de le faire.

Donc, vous devriez vérifier si votre vue est dans la fenêtre d'abord, puis retirez votre statut d'observateur dans l' didRecieveMemoryWarning

14voto

user102008 Points 8748

Tout d'abord, même lors de l' viewDidUnload n'était pas obsolète, vous avez dû annuler l'inscription de cette notification, viewDidUnload ET dealloc. Avant même d'iOS 6, viewDidUnload n'est PAS appelé dans la plupart des cas; seulement en cas de mémoire insuffisante. Donc, si vous aviez seulement le mettre dans viewDidUnload et pas dealloc avant, il n'aurait pas été annulé, et il aurait probablement écrasé quand il a été libéré et a reçu une notification. Donc, vous avez dû le mettre dans dealloc avant, qu'il ait travaillé correctement.

Deuxièmement, si vous l'avez fait correctement, vous n'avez pas besoin de faire grand chose de plus pour qu'il fonctionne correctement dans iOS 6. La seule différence dans iOS 6, c'est que les vues ne sont plus déchargés à tous (même en cas de mémoire insuffisante). C'est donc le même que dans iOS 5 lorsque vous n'avez pas exécuté dans une situation d'insuffisance de mémoire. Puisque les avis ne sont pas déchargées, viewDidLoad ne sera appelée qu'une fois, de sorte que votre notification ne sera enregistré qu'une seule fois. Il sera enregistré dans dealloc, comme vous devez l'avoir mis pour que cela ait fonctionné correctement.

10voto

Anonymous White Points 926

Alex répond que c'est bon. Mais j'aime bien l'appariement. Pour cette raison, sauf si la vue doit être notifiée lorsqu'elle n'est même pas vue, j'ajoute généralement une notification à viewWillAppear et viewDidDisappear.

4voto

Dan H Points 76

Pourquoi ne pas simplement supprimer l'observateur dans la fonction DEALLOC? Et si vous utilisez ARC, n'appelez pas [super dealloc]

Si vous voyez que la fonction dealloc du contrôleur n’est pas appelée, vous devez alors comprendre pourquoi. Peut-être avez-vous un NSTimer en cours d'exécution sur le ViewController et lorsque vous ouvrez la vue, le dealloc ne sera pas appelé. Ou la vue est conservée ailleurs où.

-1voto

jack Points 147

Cela a provoqué le blocage de nombreuses applications existantes. Bon travail.

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