2010-11-22 2 views
1

J'ai une sous-classe UIViewController qui charge un tas d'images pour chaque cellule dans une vue de table de manière asynchrone qui est gérée par une classe de téléchargement séparée. Je garde une liste de toutes ces demandes de téléchargement dans un dictionnaire qui est indexé sur l'index de la cellule qui demande l'image.Où placer le code de nettoyage dans UIViewController?

Ma question est où dois-je mettre le code qui annule le téléchargement de l'image si le contrôleur de vue est retiré du contrôleur de navc? Je dois le faire parce que si l'utilisateur répond alors que des images fixes sont téléchargées (ce qui peut prendre un certain temps), alors quand le téléchargement est terminé, le viewcontroller a déjà été libéré.

Je ne peux pas le mettre dans la méthode viewWillDisappear parce que je ne veux pas arrêter le téléchargement si l'utilisateur clique sur un onglet séparé et seulement quand le bouton de retour. Pour l'instant je mets ce code dans la méthode de viewlontrollers dealloc qui fonctionne bien même si elle ne semble pas juste pour une raison quelconque. J'ai pensé à utiliser la méthode viewDidUnload mais il semble que cela ne soit appelé que lorsqu'il y a un avertissement de mémoire faible?

Des idées?

Répondre

3

dealloc est l'endroit idéal pour cela car le contrôleur de vue est libéré et vous êtes responsable de nettoyer vos affaires.

+0

Salut, merci pour la réponse rapide . Cela inclut-il des choses comme l'énumération à travers un dictionnaire et l'appel d'une méthode pour chaque objet qu'il contient? Juste n'a jamais vu de code autre que [someobject release] à l'intérieur de dealloc. – James

+2

En général, -dealloc doit être désenregistré pour toute chose de type "délégué" pour laquelle vous vous êtes déjà enregistré. 'foo.delegate = nil' et' [[NSNotificationCenter defaultCenter] removeObserver: self] 'sont particulièrement courants. Si jamais vous utilisez -scrollToRect: animated: ou -zoomToRect: animated: (ou quel que soit leur nom), vous devrez peut-être définir 'scrollView.delegate = nil'; de manière agaçante, l '"animation" continue même si la vue de défilement n'est pas dans la hiérarchie de vue. Peut-être qu'ils ont réparé cela ... –

+0

@James Faites le nettoyage que vous avez à faire dans dealloc. Cela peut également appeler d'autres objets ou enregistrer votre état actuel. – JustSid

0

Vous voudrez peut-être envisager de mettre le code dans viewWillDisappear: de toute façon, après tout, si l'écran vous naviguez à besoin de quelque chose chargé, il sera ralenti par la charge de l'image d'arrière-plan ...

Questions connexes