Mon GUI pour une application iPhone utilise de nombreuses UIViews. L'utilisateur "bascule" à travers ces vues lorsqu'il appuie sur un bouton pour avancer ou reculer. Les vues sont stockées hors écran et ne sont ajoutées à une vue réelle que lorsque le programme doit l'afficher. Pendant le processus flip, le programme indique à la vue parente (uiscrollview) de supprimer toute sous-vue existante en utilisant la méthode removeFromSuperView, puis ajoute la nouvelle sous-vue, qui est la nouvelle page que l'utilisateur devrait voir.UIViews associés à des fuites de mémoire
Cependant, après plusieurs répétitions de ce processus sur le périphérique, le programme se bloque avec l'état de sortie gdb 101, que j'ai trouvé est provoqué par une erreur de mémoire insuffisante.
J'ai essayé de diagnostiquer ce problème en utilisant l'outil Fuites, mais en vain. Il y a seulement 1 ou 2 petites fuites de mémoire et l'utilisation totale de mem sur l'appareil par le programme est seulement de 2,5 mb. Est-il possible que la mémoire vidéo, et non la mémoire système, soit faible?
Je suis tombé sur this en ce qui concerne l'utilisation de backgroundColor et mem, mais j'ai besoin d'explications supplémentaires. Dois-je réduire la définition de backgroundColor pour empêcher le calayer de UIView de monopoliser trop de mémoire?
Oui, j'utilise un NSArray pour stocker ces vues hors écran. Au total, ils ne prennent pas autant de mémoire, mais le problème de mémoire se produit après que j'ajoute et supprime périodiquement des UIViews du ScrollView principal. Une autre chose à noter est que si je feuillette entre 2-3 des mêmes instances de vue, rien ne se passe, et tout fonctionne bien. Cependant, si je feuillette 10 vues ou plus, le programme se bloque. J'ai l'impression d'avoir presque une emprise sur ce problème. – obsoleteModel81
C'est difficile à dire sans savoir exactement ce que vous faites. Donc, deux choses: 1. Ajouter un code montrant ce que vous faites dans votre question, afin que nous puissions mieux vous aider. 2. Je suppose que vous ajoutez des vues à la demande dans cette zone et lorsque vous parcourez plusieurs vues "uniques" (c'est-à-dire que vous n'avez pas vues auparavant), vous utilisez de plus en plus de mémoire. Essayez ce qui suit: au même endroit que vous appelez removeFromSuperview, appelez également '[yourArray removeObject: view];'. Si cela résout votre problème, alors nous savons quel est le problème et pouvons trouver une solution propre/appropriée. – Itay
Il semble que retirer la vue du cache après l'avoir affichée a empêché le problème de mémoire. Tout d'abord, il est important de noter que toutes les vues ont été initialisées avant tout rendu. Toutefois, bien qu'il n'y ait plus de problème de mémoire, car les vues sont désallouées après sa suppression de la vue déroulante, le programme n'a plus la possibilité de revenir en arrière.(Il ne peut que faire la page à l'avance) L'initialisation en temps réel des composants de vue est-elle la meilleure option ici, ou existe-t-il une solution alternative? – obsoleteModel81