Question

Pour citer le document CGLayer:

  

Quartz met en cache tous les objets réutilisés, y compris les objets CGLayer.

J'ai des problèmes de mémoire sur les grandes pages et j'essaie d'implémenter un mécanisme simple selon lequel les vues sont libérées et recréées en fonction de leur affichage sur l'écran.

Par souci de simplicité, j’ai un tas de UIImages, créés à la suite d’une requête réseau, enregistrés dans un tableau quelque part. Je crée un UIImageView comme ceci:

anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release];             // owned by mainView now
[...]                          // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down

Lorsque imgView disparaît de l'écran, il est removeFromSuperview et publié. Bien d'accord? Non, la couche CGL qui existe dans Quartz n'est pas supprimée, car anImage existe toujours.

Comment puis-je contourner cela? La seule façon dans ce scénario est de créer une image exactement identique à l'arrière de Quartz avec une adresse de pointeur différente et de supprimer l'ancienne image. Et le seul moyen de le faire est de «copier en profondeur» l’image (UIImage n’implémente pas le NSCoding) ou de la redemander via le réseau (lent).

Ce que je pense, c’est que j’ai besoin de copier mes images dans une base de données et de les récupérer chaque fois qu’une vue apparaît à l’écran - mais j’aimerais bien entendre les commentaires de ces personnes.

Était-ce utile?

La solution

Ici, vous incrémentez imgView de 0 à 1.

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

Dans la ligne suivante, mainView incrémente le nombre de références. (maintenant c'est 2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

Ici, vous libérez imgView et le nombre de références redescend à un.

[imgView release]; // owned by mainView now

Je ne pense pas que vos problèmes de mémoire aient un rapport avec une image. Tant que imgView est une sous-vue, il ne libérera pas cet objet, car il a besoin de cet objet pour s'afficher à l'écran.

Ce que la ligne suivante signifie, c’est que si vous appelez par programme votre CGLayer, Quartz avec cache ce que vous avez dessiné, de sorte que vous ne redessiniez pas constamment la même chose. Ce n'est pas vraiment lié à l'ajout de sous-vues.

  

Quartz met en cache tous les objets réutilisés, y compris les objets CGLayer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top