2009-07-22 10 views
0

J'ai implémenté une grande liste de vues dans un UIScrollView. Je ne peux pas utiliser une vue de table en raison de la nature de mon application.removeFromSuperView/mémoire/changement de vue dynamique

Fondamentalement, j'ai une collection de «blocs» qui sont des contrôleurs de vue eux-mêmes, à l'intérieur d'un UIScrollView. Tout fonctionne bien mais la mémoire est un problème sur de très grandes pages. J'ai implémenté avec succès l'ajout dynamique des sous-vues (lorsqu'elles apparaissent à l'écran, elles sont disposées et ajoutées à la vue parente). Les blocs eux-mêmes sont configurés et créés en une seule fois, mais leurs vues réelles, c'est-à-dire, block.view, ne sont pas ajoutées au grand conteneur jusqu'à ce qu'elles apparaissent à l'écran. Cela fonctionne très bien, mais j'ai besoin d'un moyen de supprimer les vues de la mémoire une fois qu'elles sortent de l'écran. removeFromSuperView les fait disparaître mais ne réduit pas l'utilisation de la mémoire.

Si je supprime instantanément FromSuperView, après addSubview, le bloc n'est pas affiché et la mémoire ne monte pas. Si je retireFromSuperview après un cycle de tirage, la mémoire augmente sur le tirage et ne redescend pas, même si vous ne voyez plus la vue. C'est comme si la vue était mise en cache jusqu'à ce que je libère la vue entière. Cela n'a aucun sens car il n'utilise pas beaucoup de mémoire avant de le dessiner, même s'il a été créé.

Je ne peux pas libérer la vue car elle appartient à mon bloc (viewcontroller) qui contient beaucoup d'autres informations (par exemple, mise en page). J'ai juste besoin de récupérer la mémoire. Je sais que garder la vue en mémoire avant un cycle de tirage ne fait pas monter la mémoire donc je ne devrais pas avoir besoin de m'en débarrasser. Par exemple, si je conserve à la place de addSubview, je sais que ma vue est toujours là, mais elle n'utilise pas presque autant de mémoire.

J'ai essayé d'appeler une mémoire d'avertissement sur la vc

Répondre

0

Je crois UIViews sont intelligents de ne pas allouer en fait une couche pour lui-même jusqu'à ce qu'elle apparaisse. C'est pourquoi vous ne voyez pas l'utilisation de la mémoire augmenter jusqu'à ce que vous l'ajoutiez à une vue d'ensemble.

Ce que vous devez faire est de ne pas créer la vue jusqu'à ce qu'elle soit nécessaire, et de la libérer dès qu'elle est retirée de la vue déroulante. De cette façon, la couche sera désallouée.

Fondamentalement, vous aurez besoin de mettre en œuvre loadView afin de créer (et recréer) la vue chaque fois qu'il est accédé via la propriété view.