2008-12-01 7 views
4

Je rencontre des problèmes lorsque mon application reçoit des avertissements de mémoire insuffisante lorsque l'utilisateur se trouve dans une pile de vues du contrôleur de navigation. Après que l'utilisateur parcourt un ensemble d'options hiérarchiques dans UITableViews suivants, il peut ouvrir un document PDF dans un UIWebView (dans un contrôleur de vue différent).Comment gérer les avertissements de mémoire faible sur l'iPhone?

Tout fonctionne correctement, le PDF se charge et l'utilisateur peut feuilleter les pages. Cependant, lorsque le document est un peu grand ou comporte plusieurs pages et que l'utilisateur appuie sur le bouton "Précédent" du contrôleur de navigation, l'application se bloque lorsque le contrôleur de vue précédent dans la pile du contrôleur de navigation a été désalloué. Après avoir recherché comment gérer les avertissements de mémoire insuffisante et résoudre ce type de problème, j'ai trouvé plusieurs messages qui conseillent aux utilisateurs de libérer les objets pouvant être libérés, puis de les charger par la suite l'utilisateur essaie de charger une vue qui a été désallouée. L'un de ces articles est le poste Dealing with memory loss: the cleanup de Craig Hockenberry.

Bien que ce soit un peu utile, il ne me donne pas beaucoup d'informations à partir de laquelle travailler. Est-ce que quelqu'un peut fournir un guide simple sur la façon de traiter les avertissements de faible mémoire, et comment mettre en œuvre le «chargement paresseux» des objets?

Répondre

5

Lorsque la mémoire est faible, le système envoie une série de messages liés à la mémoire. Les contrôleurs de vue instanciés recevront le message -didReceiveMemoryWarning. Si vous ne l'implémentez pas, l'action par défaut (en supposant que le contrôleur de vue ne soit pas le plus en avant) consiste à libérer le membre de vue du contrôleur. Si vous avez des hooks dedans, ou peut-être dans ses sous-vues, cela pourrait causer des problèmes lorsque votre contrôleur sera renvoyé en haut de la pile.

+0

Voulez-vous dire TOUT membre ou seulement les IBOutlets? – Oliver

2

Votre première tâche est de comprendre ce que exactement cause le problème. Quel objet est désaffecté? Habituellement, la réparation consiste simplement à s'assurer que l'objet est conservé correctement.

Je vous suggère d'utiliser NSZombiesEnabled pour essayer de localiser l'objet avec lequel vous rencontrez des problèmes. Une fois que vous avez cela, vous pouvez vous assurer que vous le retenez correctement.

Questions connexes