103 votes

Quand dois-je libérer des objets dans - (void) viewDidUnload plutôt que dans -dealloc?

Quel est le -(void)viewDidUnload est bon pour?

Est-ce que je ne pourrais pas simplement tout relâcher en -dealloc ? Si la vue s'est déchargée, -dealloc ne serait-il pas appelé de toute façon?

51voto

Sean Murphy Points 1556

En plus de ce qui a déjà été indiqué, j'ai voulu donner plus de détails sur la logique derrière -viewDidUnload.

L'une des raisons les plus importantes pour la mise en œuvre, c'est que UIViewController sous-classes couramment contiennent également posséder des références aux différents sous-vues dans le point de vue de la hiérarchie. Ces propriétés pourraient avoir été réglé à l' IBOutlets lors du chargement à partir d'une plume, ou par programmation à l'intérieur d' -loadView, par exemple.

Le supplément de la propriété de sous-vues par la UIViewController signifie que, même lors de son point de vue est supprimée de la vue de la hiérarchie et publié pour économiser de la mémoire, à travers lequel les sous-vues sont également libérés par la vue, ils ne seront pas réellement être libéré parce que le UIViewController lui-même contient encore son propre circulation en conservant les références à ces objets. En relâchant la UIViewController supplémentaires de la propriété de ces objets, ce qui permet d'être libéré ainsi de libérer de la mémoire.

Les objets que vous relâchez ici sont généralement recréé et de nouveau lors de la UIViewController de vue est de nouveau chargé, soit à partir d'une Plume ou par le biais d'une mise en œuvre de l' -loadView.

Notez également que le UIViewController de l' view de la propriété est - nil par le temps, cette méthode est appelée.

21voto

Stephen Darlington Points 33587

La documentation dit:

Il est appelé au cours de la basse-conditions de mémoire lorsque le contrôleur a besoin de publier son point de vue et de tous les objets associés à ce point de vue pour libérer de la mémoire.

Dans la même situation dealloc est pas appelé. Cette méthode est disponible uniquement dans OS3 et au-dessus. Traitant de la même situation dans l'iPhone OS 2.x était une vraie douleur!

9voto

gazzaaa87 Points 81

C'est parce que vous aurez généralement le @property "(nonatomic, retain)" et, comme telle, le setter qui est créé pour vous des communiqués de l'objet courant et conserve alors l'argument c'est à dire

auto.property = nil;

...fait quelque chose le long des lignes de:

propriété [release]; property = [nil retain];

Par conséquent, vous sont en train de tuer deux oiseaux avec une pierre: gestion de la mémoire (la libération de l'objet existant) et en attribuant le pointeur à zéro (depuis l'envoi d'un message à un néant pointeur sera de retour nul).

Espérons que cela aide.

8voto

David Maymudes Points 5153

Rappelez-vous que viewDidUnload est une méthode de l'avis du contrôleur, pas dans la vue. La vue de l' dealloc méthode sera appelée lorsque la vue décharge, mais la vue du contrôleur dealloc méthode ne peut pas être appelé jusqu'à ce que plus tard.

Si vous obtenez un avertissement de mémoire faible et votre point de vue n'est pas visible, ce qui va se passer par exemple à propos tout moment vous utilisez un UIImagePickerController pour permettre à l'utilisateur de prendre une photo, votre vue sera déchargé et doivent faire rechargé par la suite.

6voto

Thanks Points 12709

Conclusion:

Afficher les Contrôleurs ont une vue sur la propriété. Généralement, une plume ou un morceau de code ajoute d'autres vues de ce point de vue. Cela se produit souvent à l'intérieur d'une méthode viewDidLoad, comme ceci:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createManyViewsAndAddThemToSelfDotView];
}

en outre, une plume fichier peut créer un bouton et l'ajouter à la vue du contrôleur de vue.

Sur iPhone OS 2.2, quand -didReceiveMemoryWarning a été invoqué à partir du système, vous avez eu à sortir quelque chose de libérer de la mémoire. Vous pourriez libération, le point de vue du contrôleur de vue, si cela avait un sens. Ou juste de mémoire grande consommatrice de contenu.

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

Maintenant, dans le nouveau OS 3.0, il y a un -viewDidUnload méthode, qui sera lancée à partir du système lorsque le point de vue a été déchargé en raison de la faible mémoire (corrigez-moi: au fait, quand cela s'appelle?)

-viewDidUnload est utilisé pour la libération de tous les objets qui lui ont appartenu à la fois par la vue contrôleur et la vue. La raison: Si une vue contrôleur contient des références à l'enfant de la vue, c'est à dire un bouton, l'enfant référencé points de vue ne sera libéré, parce que leur conserver le comte est >= 1. Après ils sont diffusés en viewDidUnload, ils peuvent obtenir libéré de la mémoire.

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