2009-08-14 8 views
1

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?

Répondre

0

Où stockez-vous toutes ces vues? Plus précisément, avez-vous un tableau (NSArray) qui a ces vues lorsque vous les feuilletez?

Les vues ne seront pas désaffectées à moins que leur nombre de références ne soit nul. Votre `` [[UIView alloc] init] fait le compte de référence à 1, l'ajoutant comme une sous-vue le fait 2, et le retirer d'une sous-vue le fait à nouveau 1. Voyant que vous n'avez pas entendu parler d'une fuite spécifique, il semble que vous ne fuyez pas autant que de le stocker quelque part.

+0

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

+0

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

+0

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

1

Avez-vous accès à l'exemple de code iphone sur apple? On dirait que le programme PageControl Sample Code est un bon exemple de ce que vous cherchez. Et les exemples de programmes de code n'ont pas de fuites de mémoire ou un tel problème :) Lien here

Lorsque vous utilisiez des instruments, avez-vous vérifié les ObjectAllocations? J'ai trouvé cela pour être plus utile que l'outil de fuites (les allocations d'objet sont l'un des outils que les fuites incluent cependant). Je pense que si la mémoire vidéo s'épuisait, ce serait une erreur différente, mais je peux me tromper.

+0

Kiyoshi a certainement la bonne idée, et le bon lien. Les techniques dont je parle sont mentionnées dans l'exemple PageControl, mais elles ne sont pas complètes - vous devez toujours supprimer les sous-vues inutilisées. – Itay

Questions connexes